private IScriptWriter CreateScriptWriter(IScriptingOptions scriptingOptions, IConnectionSettings connSettings) { IScriptWriter writer; if (scriptingOptions.UseMultipleFiles) { writer = new MultiFileScriptWriter(scriptingOptions.ExportDirectory); } else { writer = new SingleFileScriptWriter(scriptingOptions.ExportDirectory, connSettings.Database); } writer.MessageManager = messageManager; return(writer); }
protected static int CalculateScriptObjectCount(IScriptingOptions options) { Throw.If(options, "options").IsNull(); int tableWeight = options.ScriptSchema ? 1 : 0; tableWeight += options.ScriptIndexes ? 1 : 0; //tableWeight += options.ScriptForeignKeys ? 1 : 0; tableWeight += options.ScriptData ? 1 : 0; int exportObjectTotal = options.TablesToScript.Count * tableWeight; exportObjectTotal += options.ViewsToScript.Count; exportObjectTotal += options.SprocsToScript.Count; return(exportObjectTotal); }
/// <summary> /// Scripts a database to disk for use in creating a brand new db. This /// method scripts the entire object, i.e. no differntial or comparisons /// are done. /// </summary> /// <param name="connectionInfo">The db connection parameters.</param> /// <param name="scriptingOptions">The export scripting settings.</param> public virtual void Script(IConnectionSettings connectionInfo, IScriptingOptions scriptingOptions) { Throw.If(connectionInfo, "connectionInfo").IsNull(); Throw.If(scriptingOptions, "scriptingOptions").IsNull(); messageManager.OnScriptMessage("Starting database scripting."); IDatabase db = DatabaseConnectionFactory.CreateDbConnection(connectionInfo); List <ITable> tablesToScript = new List <ITable>(); foreach (DbObjectName tableName in scriptingOptions.TablesToScript) { ITable table = db.Tables[tableName.ShortName]; if (table == null) { throw new SqlMigrationException( string.Format("Unable to find the table {0} in database {1} on server.", tableName, connectionInfo.Database)); } tablesToScript.Add(table); } IScriptWriter writer = CreateScriptWriter(scriptingOptions, connectionInfo); int totalObjects = CalculateScriptObjectCount(scriptingOptions); int exportCount = 0; if (scriptingOptions.ScriptSchema) { foreach (ITable table in tablesToScript) { ScriptTableSchema(table, writer); OnProgressEvent(++exportCount, totalObjects); } } if (scriptingOptions.ScriptIndexes) { foreach (ITable table in tablesToScript) { ScriptTableIndexes(table, writer); OnProgressEvent(++exportCount, totalObjects); } } if (scriptingOptions.ScriptData || scriptingOptions.ScriptDataAsXml) { IScriptWriter dataWriter = writer; IDataMigrator dataMigrator = new DataMigrator(); if (scriptingOptions.ScriptDataAsXml) { dataMigrator = new XmlDataMigrator(); dataWriter = new XmlDataWriter(scriptingOptions.ExportDirectory, messageManager); } foreach (ITable table in tablesToScript) { ScriptTableData(dataMigrator, table, dataWriter); OnProgressEvent(++exportCount, totalObjects); } } if (scriptingOptions.ScriptForeignKeys) { foreach (ITable table in tablesToScript) { ScriptTableForeignKeys(table, writer); OnProgressEvent(++exportCount, totalObjects); } } foreach (DbObjectName sprocName in scriptingOptions.SprocsToScript) { IProcedure sproc = db.Procedures[sprocName.ShortName]; if (sproc == null) { throw new SqlMigrationException( string.Format("Unable to find the procedure {0} in database {1} on server.", sprocName, connectionInfo.Database)); } ScriptSproc(sproc, writer); OnProgressEvent(++exportCount, totalObjects); } foreach (DbObjectName viewName in scriptingOptions.ViewsToScript) { IView view = db.Views[viewName.ShortName]; if (view == null) { throw new SqlMigrationException( string.Format("Unable to find the view {0} in database {1} on server.", viewName, connectionInfo.Database)); } ScriptView(view, writer); OnProgressEvent(++exportCount, totalObjects); } messageManager.OnScriptMessage("Finished database scripting."); }
/// <summary> /// Returns an alter script to upgrade a database from target version /// to source version. /// </summary> /// <remarks> /// <para>This method is not thread safe.</para> /// <para>Operations are scripted in the following order: /// <list type="number"> /// <item>create new tables</item> /// <item>add new columns to existing tables</item> /// <item>drop removed foreign keys</item> /// <item>drop removed columns</item> /// <item>drop removed tables</item> /// <item>alter any changed columns (like if you added a new default to a column)</item> /// <item>add new foreign keys</item> /// <item>add new indexes</item> /// <item>functions</item> /// <item>views</item> /// <item>sprocs</item> /// </list> /// </para> /// </remarks> /// <param name="connectionInfoSourceDb">The newer, source db.</param> /// <param name="connectionInfoTargetDb">The older, target db to upgrade.</param> /// <param name="scriptingOptions">The export scripting settings.</param> public virtual void ScriptDifferences(IConnectionSettings connectionInfoSourceDb, IConnectionSettings connectionInfoTargetDb, IScriptingOptions scriptingOptions) { Throw.If(connectionInfoSourceDb, "connectionInfoSourceDb").IsNull(); Throw.If(connectionInfoTargetDb, "connectionInfoTargetDb").IsNull(); Throw.If(scriptingOptions, "scriptingOptions").IsNull(); messageManager.OnScriptMessage("Starting scripting database differences."); IDatabase srcDb = DatabaseConnectionFactory.CreateDbConnection(connectionInfoSourceDb); IDatabase targetDb = DatabaseConnectionFactory.CreateDbConnection(connectionInfoTargetDb); IScriptWriter writer = CreateScriptWriter(scriptingOptions, connectionInfoTargetDb); int totalObjects = CalculateScriptObjectCount(scriptingOptions); int exportCount = 0; foreach (DbObjectName tableName in scriptingOptions.TablesToScript) { // TODO: Need to split this up like the Script() method to order things correctly? ITable table = srcDb.Tables[tableName.ShortName]; if (table == null) { throw new SqlMigrationException( string.Format("Unable to find the source table {0} in database {1} on server.", tableName, connectionInfoSourceDb.Database)); } ITable targetTable = targetDb.Tables[tableName.ShortName]; if (targetTable == null) { throw new SqlMigrationException( string.Format("Unable to find the target table {0} in database {1} on server.", tableName, connectionInfoTargetDb.Database)); } if (scriptingOptions.ScriptData) { ScriptTableDataDifferences(table, targetTable, writer); OnProgressEvent(++exportCount, totalObjects); } // TODO: constraints, Schema, Indexes? } messageManager.OnScriptMessage("Finished scripting database differences."); // sourceDB = source; // targetDB = target; // // messageManager.OnScriptMessage("Starting database differencing."); // // script = new SqlScript(); // // ScriptNewTablesAndColumns(); // ScriptRemovedForeignKeys(); // ScriptRemovedIndexes(); // ScriptRemovedTablesAndColumns(); // ScriptAlteredColumns(); // ScriptNewForeignKeys(); // ScriptNewIndexes(); // // ScriptNewAndAlteredSprocs(); // ScriptRemovedSprocs(); // // messageManager.OnScriptMessage("Finished database differencing."); }