SQL Server and PowerShell Let’s Get Serious Did you remember to? Start VM’s? Start SQL instances on local machine (both!) Start SSMS? Bring up web site to show? Open source code to show? Delete the .sql files? 11/12/2018
About me Contact Info I’m a Senior SQL Server DBA at IGS Energy in Dublin, Ohio. I’ve been using SQL Server since SQL Server 2000 and I love it. I also enjoy DevOps, release management, and PowerShell. dfurgiuele@igsenergy.com @pittfurg http://www.port1433.com http://www.genesface.com 11/12/2018
AGENDA Why using PowerShell will make your life more awesome SQL Server PowerShell Provider Code, code, and more code! 11/12/2018
Using PowerShell Will Make Your Life Awesome! “I don’t want to learn PowerShell because I don’t have time.” “Why would I waste time writing this in PowerShell when I can already do it in T-SQL?” Understanding PowerShell in general increases your worth. Helps you interact with System Administrators better. Useful for deploying code or system changes. Saves you a ton of time (automate all the things!). Core Servers laugh at your puny GUI. Let me know how you plan on automating things in Azure. 11/12/2018
The SQL Server PowerShell Provider SQLPS Module It’s where the awesome lives Provides a directory hierarchy for interacting with SQL Server For more information, including cmdlets and SMO objects: https://msdn.microsoft.com/en-us/library/cc281947(v=sql.110).aspx Import the module Show the path Show databases, use get-member Show names and sizes 11/12/2018 Report Out October 2013
Let’s Just Do it! 11/12/2018
Real-World Example: Export Database Objects (not just tables) for DR purposes Why backup an entire reporting replica when you can just grab the good bits? Perfect for reporting environments Talk about the .Script() method, maybe bring up MSDN page if able? To File: .\Get-DatabaseObjects.ps1 -serverName localhost -instanceName sql2014 -databaseName AdventureWorks2014 -saveTo File -fileName C:\temp\Adventureworks2014_Objects.sql –Verbose To Database: .\Get-DatabaseObjects.ps1 -serverName localhost -instanceName sql2014 -databaseName AdventureWorks2014 -saveTo Database -repoServerName localhost -repoInstanceName sql2014 –repoDatabaseName Admin -repoSchemaName Repo -repoTableName ObjectsRepository –Verbose Create TWO new databases when you’re done, and run the generated script! 11/12/2018
Real-World Example: Dynamically Copy Database Tables From One Database to Another PowerShell makes it easy to iterate over a Database/Schema and script out objects while also copying the data. What about Foreign Keys? What about Indexes? Permissions? Good intro into PowerShell provider and SQL drive paths Refresh() method on tables… why? Create a new database .\Copy-DatabaseTables.ps1 -SourceServerName localhost -SourceInstanceName sql2014 -SourceDatabaseName AdventureWorks2014 -SourceSchemaName Sales -DestinationServerName localhost -DestinationInstanceName sql2014 -DestinationDatabaseName SomeDatabase -DestinationSchemaName Sales -WorkingDirectory C:\temp –Verbose It will fail; FK check constraints… run it again against the other database .\Copy-DatabaseTables.ps1 -SourceServerName localhost -SourceInstanceName sql2014 -SourceDatabaseName AdventureWorks2014 -SourceSchemaName Sales -DestinationServerName localhost -DestinationInstanceName sql2014 -DestinationDatabaseName AnotherDatabase -DestinationSchemaName Sales -WorkingDirectory C:\temp -noCheckConstraints -Verbose 11/12/2018
Real-World Example: Copy SSIS Environments Need to clone that SSIS environment locally? What about to another server? Or another instance? Because it’s a colossal pain it the ass! Mention “SSIS” instead of “SQL” path, how the provider lists all instances under the main hostname Another good example of .Refresh() .\Export-SSISEnvironment.ps1 -SourceServer localhost -SourceInstance sql2014 -SourceFolder SomeProject -sourceEnvironment QA -targetServer localhost -targetInstance sql2014 -targetFolder NewProject –Verbose 11/12/2018
Real-World Example: Auditing SQL Server Group Permissions Just who has access to that database? In an active directory environment, guess what? There’s a tool (and module!) for that… Great example about how you can marry multiple products together Install-windowsfeature -name AD-Domain-Services –IncludeManagementTools .\Start-SQLPermissionsAudit.ps1 -servername localhost -databaseName AdventureWorks2014 -Verbose | Export-Csv Users.txt -NoTypeInformation 11/12/2018
Wrapping Up PowerShell is a great tool that you should be using, or trying to use. Not saying it should solve/replace all your tasks, just supplement them. Helps blur the line between a SQL Server Professional/DevOps/Iteration Management/etc A more robust you = a more in-demand you. 11/12/2018
Would you like to know more? MSDN Resources: SQL Server PowerShell Provider: https://msdn.microsoft.com/en-us/library/cc281947.aspx Windows PowerShell Reference: https://technet.microsoft.com/en-us/library/ms714469(v=vs.85).aspx People/Blogs: Hey, Scripting Guy! http://blogs.technet.com/b/heyscriptingguy/ Mike Fal (@mike_fal): http://www.mikefal.net/ Allen White (@SQLRunr): http://sqlblog.com/blogs/allen_white/default.aspx Ben Miller (@dbaduck) 11/12/2018
About me Contact Info I’m a Senior SQL Server DBA at IGS Energy in Dublin, Ohio. I’ve been using SQL Server since SQL Server 2000 and I love it. I also enjoy DevOps, release management, and PowerShell. dfurgiuele@igsenergy.com @pittfurg http://www.port1433.com http://www.genesface.com 11/12/2018
Questions? 11/12/2018