SQL Server 2012: générer des scripts à partir de la ligne de commande

19

J'exécute SQL Server 2012.

SQL Server Management Studio a la possibilité de cliquer avec le bouton droit sur une base de données, puis de sélectionner Tâches et générer des scripts.

Existe-t-il un moyen d'automatiser cela via la ligne de commande?

Je veux créer un script qui inclut le schéma et les données de la base de données entière.

Des outils comme ScriptDBet sqlpubwiz.exetous semblent cibler SQL Server 2005. Qu'en est-il de SQL Server 2012?

Harald
la source

Réponses:

20

Le mieux est d'utiliser Powershell - si vous comptez l'utiliser fréquemment. Vous pouvez vous référer à la génération automatisée de scripts avec Powershell et SMO .

De plus, les extensions SQL Server PowerShell (SQLPSX) sont très utiles lorsque vous travaillez avec Powershell. Tous les modules ont des fichiers d'aide, par exemple Get-SqlScripter .

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

Pour les outils tiers, je vous recommande fortement de vérifier (il existe de nombreux outils tiers, mais ci-dessous ceux que j'ai utilisés et ils sont excellents):

Kin Shah
la source
10

Tara Raj de Microsoft a récemment annoncé que l'équipe Microsoft SQL a publié un ensemble d'outils de ligne de commande pour générer des scripts T-SQL qui semblent faire exactement ce que vous avez demandé:

mssql-scriptter

Mssql-scriptter est l'équivalent en ligne de commande multiplateforme de l'expérience largement utilisée de l'assistant de génération de scripts dans SSMS.

Vous pouvez utiliser mssql-scripter sur Linux, macOS et Windows pour générer des scripts T-SQL du langage de définition de données (DDL) et du langage de manipulation de données (DML) pour les objets de base de données dans SQL Server exécutés n'importe où, Azure SQL Database et Azure SQL Data Warehouse . Vous pouvez enregistrer le script T-SQL généré dans un fichier .sql ou le diriger vers les utilitaires standard * nix (par exemple, sed, awk, grep) pour d'autres transformations. Vous pouvez modifier le script généré ou le vérifier dans le contrôle de code source et ensuite exécuter le script dans vos processus de déploiement de base de données SQL existants et les pipelines DevOps avec des outils de ligne de commande SQL multiplateforme standard tels que sqlcmd.

Mssql-scriptter est construit à l'aide de Python et intègre les principes de convivialité des nouveaux outils Azure CLI 2.0. Le code source peut être trouvé sur Github à https://github.com/Microsoft/sql-xplat-cli , et nous nous réjouissons de vos contributions et demandes de pull!

Quelques exemples d'utilisation:

Générer des scripts DDL pour tous les objets de base de données (par défaut) dans la base de données Adventureworks et les exporter vers stdout

$ mssql-scripter -S localhost -d AdventureWorks -U sa

Générez des scripts DDL pour tous les objets de base de données et des scripts DML (instructions INSERT) pour toutes les tables de la base de données Adventureworks et enregistrez le script dans un fichier

$ mssql-scripter -S localhost -d AdventureWorks -U sa schema-and-data  > ./output.sql
BradC
la source
9

J'ai écrit un utilitaire de ligne de commande open source nommé SchemaZen qui fait cela. C'est beaucoup plus rapide que les scripts de gestion studio et sa sortie est plus conviviale pour le contrôle de version. Il prend en charge l'écriture de scripts à la fois sur le schéma et les données.

Pour générer des scripts exécutés:

script schemazen.exe --server localhost --database db --scriptDir c: \ somedir

Ensuite, pour recréer la base de données à partir de scripts exécutés:

schemazen.exe créer --server localhost --database db --scriptDir c: \ somedir
Seth Reno
la source
0

Vous pouvez utiliser les versions en ligne de commande de xSQL Schema Compare et xSQL Data Compare . Avec les versions en ligne de commande, vous pouvez planifier des comparaisons périodiques de données et de schémas par rapport à une base de données vide et cela a toujours les scripts pour créer une réplique exacte de la dernière version de votre base de données à partir de zéro.

Divulgation: je suis affilié à xSQL.

Endi Zhupani
la source
0

Juste une mise à jour: dans les versions actuelles des modules PowerShell SQL Server (SQL Server 2014 et suivants, je pensais. Testé sur SSMS 17), la plupart de ces options sont des commandes et des méthodes natives.

Par exemple, vous pouvez utiliser Get-SqlDatabase et des méthodes telles que .Script () et .EnumScript (). C'est vraiment utile et simple, surtout si vous voulez une approche plus granulaire (tables spécifiques et autres objets).

Par exemple, cela générera des scripts CREATE pour les fonctions définies par l'utilisateur et l'enregistrera dans un fichier:

$Database = Get-SqlDatabase -ServerInstance $YourSqlServer -Name $YourDatabaseName

$MyFuncs = $Database.UserDefinedFunctions | Where Schema -eq "dbo"
$MyFuncs.Script() | Out-File -FilePath ".\SqlScripts\MyFunctions.sql"

Si vous souhaitez créer des scripts de données et d'éléments comme des index, des clés, des déclencheurs, etc., vous devrez spécifier des options de script, comme ceci:

$scriptOptions = New-Object -TypeName Microsoft.SqlServer.Management.Smo.ScriptingOptions

$scriptOptions.NoCollation = $True
$scriptOptions.Indexes = $True
$scriptOptions.Triggers = $True
$scriptOptions.DriAll = $True
$scriptOptions.ScriptData = $True

$Database.Tables.EnumScript($scriptOptions) | Out-File -FilePath ".\AllMyTables.sql"

Notez que la méthode Script () ne prend pas en charge les données de script. Utilisez EnumScript () pour les tableaux.

Une seule table :

($Database.Tables | Where Name -eq "MyTableName").EnumScript($scriptOptions)

Toutes vos vues, enregistrez un fichier pour chaque vue, DROP et CREATE script:

ForEach ($view in $($Database.Views | Where Schema -eq "dbo")) {

    "`nIF OBJECT_ID('$($view.Name)') IS NOT NULL DROP VIEW $($view.Name);`n`n" | Out-File -FilePath ".\SqlScripts\$($view.Name).sql"    
    $view.Script() | Out-File -FilePath ".\SqlScripts\$($view.Name).sql" -Append
}

J'espère que cela t'aides.

Victor Lopes
la source