Automatisiertes Sichern von Datenbanken bzw. deren Skripte ist eine oftmals notwendige Tätigkeit eines DBA.
Export Schema mittels SQL Server Management Studio
SSMS bietet daher out-of-the-Box die Möglichkeit das automatisiert zu machen:
genaue Anleitungen siehe:
- Export Schema using SQL Server Management Studio (SSMS)
- How to Generate Scripts In SQL Server
- Script Data in MS SQL Server 2008 Database Tables using Generate SQL Server Script Wizard
Automatisierung?
Das mag zwar sinnvoll sein, wenn man mal schnell von einer DB manuell eine “Sicherung” ziehen möchte, um sie beispielsweise auf GitHub zu veröffentlichen. Um jedoch mehrere Datenbanken zu sichern oder automatisiert die Datenbanken rauszuschreiben, ist es absolut nicht geeignet. Welche anderen Methoden gibt es:
Methode 1: powershell
Hinsichtlich der Powershell-Umgebung muss man 3 Ansätze differenzieren
- (a) SMO – Methode 1.1, 1.2, 1.3
- (b) Microsoft SQL Server Modul sqlps / ab 2016 SQLServer Modul – Methode 1.4
- (c) das GitHub Projekt sqlpsx – Methode 4
Die in meinen Augen beste Methode ist die Verwendung von SMO (Server Management Objects) unter powershell. (Das geht auch mit .NET) Bei der Verwendung von Powershell und SMo gibt es jedoch auch mehrere Methoden:
Methode 1.1. Microsoft.SqlServer.Management.Smo.ScriptingOptions
Das Grundprinzip besteht darin, die Objekte, die gescripted werden sollen zu ermitteln und diese dann mittels … rauszuschreiben
$so = new-object (‘Microsoft.SqlServer.Management.Smo.ScriptingOptions’)
$objs.Script($so)+”GO” | out-File $OutFile
Die Methode entspricht dem “Generate Script”:
Das von mir meist verwendete Script sieht folgendermaßen aus:
Methode 1.2 Microsoft.SqlServer.Management.Smo.Transfer
Diese Methode ist eigentlich gedacht, dass man Objekte von einem auf einen anderen Server transferiert. Der Funktionsumfang entspricht der SSIS Komponente für Transfer Database Task.
Das Prinzip sieht folgendermaßen aus:
$transfer = new-object (“Microsoft.SqlServer.Management.Smo.Transfer”) $db
$transfer.Options.ScriptBatchTerminator = $true # this only goes to the file
$transfer.Options.ToFileOnly = $true # this only goes to the file
$transfer.Options.Filename = “XXX.sql”;
$transfer.ScriptTransfer()
Methode 1.3 Microsoft.SqlServer.Management.Smo.Scripter
Die Scripter Methode entspricht ungefähr dem, das unter “Script XX as” im Kontextmenü zur Verfügung steht:
Der Aufbau sieht folgendermaßen aus:
$scripter = New-Object (‘Microsoft.SqlServer.Management.Smo.Scripter’) ($server)
$scripter.Options.ToFileOnly = $true
$scripter.Options.FileName =”XXX.sql”;
$scripter.Script($object) // $object = ein einzelnes Objekt, dh. es muss innerhalb einer Schleife verwendet werden.
Methode 1.4 Powershell SQL Modul & .EnumScript() bzw .Script()
weiterführende Links
- Microsoft.SqlServer.Management.Smo.ScriptingOptions
- Microsoft.SqlServer.Management.Smo.Transfer
- Microsoft.SqlServer.Management.Smo.Scripter
- zum SMO (SQL Server Management Object)
- wer sich noch weiter in die Thematik einlesen möchte, dem seien folgende Büch empfohlen
- Dantos, Donabel – Powershell For Sql Server Essentials: Manage And Monitor Sql Server Administration And Application Deployment With Powershell
- Donaebl Santos – SQL Server 2014 with Powershell v5 Cookbook
Methode 2: MSSQL-Scripter utility
Beim mssql-scripter handelt es sich um ein python script, das die Funktionalität des “Generate Scripts Wizard” nachbaut. Da ich ihn noch nie verwendet habe, kann ich dazu nichts sagen.
- microsoft / mssql-scripter
- Jeffrey Yao – MSSQL-Scripter Tool and Examples to Generate Scripts for SQL Server Objects
- Try new SQL Server command line tools to generate T-SQL scripts and monitor Dynamic Management Views
Methode 3: sqlpubwiz (Microsoft SQL Server Publishing Wizard file) – Tool zu SSMS
Bis SQL 2008 wurde sqlpubwiz separat ausgeliefert und war unter (C:\Program Files\Microsoft SQL Server\90\Tools\Publishing\sqlpubwiz) zu finden. Nun ist es in SSMS.exe integriert und verwendet die Microsoft.SqlServer.Management.SqlScriptPublishUI.dll.
- SQL Scripting Wizard
- Pinal Dave – SQL SERVER – Generate Script with Data from Database – Database Publishing Wizard
Methode 4: Get-SQLScripter
In Kombination mit dem SQL Powershell-Modul SQLPSX, kann man Tabellen folgendermaßen exportieren:
Get-SqlDatabase -dbname database1 -sqlserver server | Get-SqlTable | Get-SqlScripter | Set-Content -Path D:\scripts\script.sql
Get-SqlDatabase -dbname database1 -sqlserver server | Get-SqlStoredProcedure | Get-SqlScripter
Get-SqlDatabase -dbname database1 -sqlserver server | Get-SqlView | Get-SqlScripter
Seit es die Methode 1.4 gibt, gibt es keinen wirklichen Vorteil durch dieses SQL Modul in Bezug auf das Herausschreiben von Skripten.
Methode 5: sp_OACreate
Neben diesen Methoden gibt es noch die Methode direkt im SQL, die jedoch in den meisten Fällen aus Sicherheitsgründe deaktiviert ist. SQL Server blocked access to procedure ‘sys.sp_OACreate’ of component ‘Ole Automation Procedures’ because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of ‘Ole Automation Procedures’ by using sp_configure. For more information about enabling ‘Ole Automation Procedures’, search for ‘Ole Automation Procedures’ in SQL Server Books Online.
Nayan Patel – generate script for all stored procedures for the given database.
Methode 6: eigenständige Programme (kostenpflichtig)
- SQL Scripter (kostenpflichtig)
- SQLScripter (kostenpflichtig)
- mkurz/SQLServerScripter – verwendet die Microsoft.SqlServer.Management.Smo.Scripter-Methode
- bhank/ScriptDB
- sethreno/schemazen
Fazit
Es gibt doch einige Methoden, die man verwenden kann, um Skripte für SQL-Objekte zu erzeugen. Welche ist aber nun die beste?
Wenn man mal schnell eine Tabelle oder so exportieren möchte, empfiehlt sich Methode 1.4 (.Script) . In den anderen Fällen verwende ich das Script unter 1.1 Microsoft.SqlServer.Management.Smo.ScriptingOptions.