Comment générer des scripts SQL à l'aide du scripteur SMO

Ma database contient des tables, des vues et tout. Et j'ai besoin d'un moyen de générer un script SQL pour tous les DDL de manière automatisée. Pas besoin de données.

Il existe des contraintes FK, donc les scripts de création de table doivent être ordonnés correctement. Certaines vues utilisent une autre vue, donc les scripts de création de vue doivent également être commandés correctement.

À partir d'un script présenté sur MSDN Blog , j'ai obtenu ce qui suit:

function Generate-SqlScript { param( [ssortingng]$srvname, [ssortingng]$database, [ssortingng]$ScriptOutputFileName ) [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null $srv = New-Object ("Microsoft.SqlServer.Management.SMO.Server") ($srvname) $allUrns = @() $allUrns += $srv.Databases[$database].Tables | foreach { $_.Urn} $allUrns += $srv.Databases[$database].Views | foreach { $_.Urn} $scriptingOptions = New-Object ("Microsoft.SqlServer.Management.SMO.ScriptingOptions") $scriptingOptions.WithDependencies = $true $scriptingOptions.AllowSystemObjects = $false $scriptingOptions.ToFileOnly = $true $scriptingOptions.Permissions = $true $scriptingOptions.FileName = "$ScriptOutputFileName" $scripter = New-Object ("Microsoft.SqlServer.Management.SMO.Scripter") ($srv) $scripter.Options = $scriptingOptions; $scripter.Script($allUrns) } Generate-SqlScript .\sqlexpress <MyDbName> <FilePath> 

Maintenant, le problème est, avec l'option WithDependencies, le script de vue inclut ses tables dépendantes, qui étaient déjà incluses plus tôt. Si je retire l'option WithDependencies, le script généré ne reflète pas l'ordre approprié.

Ainsi, le résultat final contient toutes les informations, mais il n'est pas exécutable. Cela génère une erreur car il ne peut pas créer la table deux fois.

Je trouve trop de messages parlant de scripteur SMO pour cela, donc je suppose qu'il doit y avoir quelque chose qui me manque. Ou … est-ce que tous ces messages ont manqué ce problème?

Vous devez searchr et sortinger les tables dans l'ordre des dependencies dans votre script PowerShell avant de créer un script pour les objects. Revoyez une implémentation de ceci sur le blog suivant: http://patlau.blogspot.com/2012/09/generate-sqlserver-scripts-with.html

Le concept était plus clair pour moi en C #. Consultez: http://sqlblog.com/blogs/ben_miller/archive/2007/10/18/scripting-tables-views-and-data-using-smo-part-3.aspx

  1. Script toutes les tables sans key étrangère, puis script uniquement les foreign keys. Vous pouvez le faire en utilisant les options de script, et ainsi les dependencies entre les tables dues aux FK n'auront aucune importance.
  2. Utilisez l'object DependencyWalker SMO. Vous pouvez append les URN pour les vues, puis requestr une list linéaire des dependencies. Ma réponse ici à une question similaire contient un exemple de comment l'utiliser.

Vous pouvez adopter une approche et un script différents des tables et des vues. Généralement dans cet ordre, les choses fonctionnent, mais pas 100%.

Je définirais WithDependencies à false

C'est certes un hack, mais vous pouvez patcher le script avant de l'exécuter en ajoutant la gestion des erreurs. Vous pourriez probablement tirer parti du nouvel parsingur en V3 pour automatiser cela.