private static void GenerateBuildDeltaProcedures(string schema, string tableName, TrackingTable trackingTable, List<SchemaDataSet.ColumnsRow> targetTableColumns, StringBuilder sqlBuilder, AuditUpdateParameters updateParameters) { CreateUpdateDeltaTableProcedure createUpdateDeltaTableProcedureTemplate = new CreateUpdateDeltaTableProcedure(schema, tableName, trackingTable, targetTableColumns, updateParameters); string sql = createUpdateDeltaTableProcedureTemplate.TransformText(); sqlBuilder.AppendLine(sql); SchemaDataSet schemaDataSet = updateParameters.SchemaDataSet; if (schemaDataSet.SchemaTables.TableExists(updateParameters.AuditingSchema, "Catalog")) { EntityConnectionStringBuilder connectionStringBuilder = Generator.GetEntityConnectionStringBuilder(updateParameters); AuditFrameworkEntities context = new AuditFrameworkEntities(connectionStringBuilder.ToString()); IOrderedQueryable<Catalog> priorVersionTrackingTableQuery = from catalog in context.Catalogs where catalog.AuditedSchema.Equals(schema, StringComparison.OrdinalIgnoreCase) where catalog.AuditedTableName.Equals(tableName, StringComparison.OrdinalIgnoreCase) where catalog.Version < trackingTable.Version where !catalog.Archived orderby catalog.Version descending select catalog; foreach (Catalog catalog in priorVersionTrackingTableQuery) { TrackingTable priorTrackingTable = TrackingTable.Parse(catalog.AuditingTableName); CreateUpdateDeltaPriorTableProcedure createUpdateDeltaPriorTableProcedureTemplate =new CreateUpdateDeltaPriorTableProcedure(schema, tableName, trackingTable, priorTrackingTable, targetTableColumns, updateParameters); sql = createUpdateDeltaPriorTableProcedureTemplate.TransformText(); sqlBuilder.AppendLine(sql); } } }
internal static void GenerateAuditForAllSchemas(StringBuilder sqlBuilder, AuditUpdateParameters updateParameters, Action<string, float?> reportProgress) { foreach (string schema in updateParameters.SchemasToAudit) { GenerateAuditForSchema(schema, sqlBuilder, updateParameters, reportProgress); } }
private static void GenerateAuditForSchema(string schema, StringBuilder sqlBuilder, AuditUpdateParameters updateParameters, Action<string, float?> reportProgress) { reportProgress(string.Format("Generating audit for schema {0}", schema), null); SchemaDataSet schemaDataSet = updateParameters.SchemaDataSet; SchemaDataSet.SchemaPrimaryKeysDataTable primaryKeysDataTable = schemaDataSet.SchemaPrimaryKeys; primaryKeysDataTable.FillPrimaryKeysBySchema(schema, updateParameters.AuditingDatabaseConnection); SchemaDataSet.SchemaTablesDataTable schemaTables = schemaDataSet.SchemaTables; var schemaTablesRows = schemaTables.AsEnumerable(); var schemaTablesQuery = from schemaTableRow in schemaTablesRows where schemaTableRow.TABLE_SCHEMA.Equals(schema) where schemaTableRow.TABLE_TYPE.Equals("BASE TABLE") orderby schemaTableRow.TABLE_NAME select schemaTableRow; foreach (SchemaDataSet.SchemaTablesRow schemaTablesRow in schemaTablesQuery) { string tableName = schemaTablesRow.TABLE_NAME; if (!updateParameters.TablesNotAudited.Cast<string>().Any(name => name.Equals(tableName, StringComparison.OrdinalIgnoreCase))) { GenerateTableAudit.GenerateAuditForTable(schema, tableName, primaryKeysDataTable, sqlBuilder, updateParameters, reportProgress); } } reportProgress(string.Format("Generated audit for schema {0}", schema), null); }
internal static void CreateBaseAuditingProcedures(StringBuilder sqlBuilder, AuditUpdateParameters updateParameters, Action<string, float?> reportProgress) { GenerateRequestTransactionSequenceProcedure(sqlBuilder, updateParameters); GenerateCurrentTransactionSequenceProcedure(sqlBuilder, updateParameters); GenerateReleaseTransactionSequenceProcedure(sqlBuilder, updateParameters); reportProgress("Generated TransactionSequence procedures", null); }
internal SetBaseline(string schema, string tableName, TrackingTable trackingTable, List<SchemaDataSet.ColumnsRow> targetTableColumns, AuditUpdateParameters updateParameters) { _schema = schema; _tableName = tableName; _trackingTable = trackingTable; _targetTableColumns = targetTableColumns; _params = updateParameters; }
internal CreateUpdateDeltaTableProcedure(string schema, string tableName, TrackingTable trackingTable, List<SchemaDataSet.ColumnsRow> targetTableColumns, AuditUpdateParameters updateParameters) { _schema = schema; _tableName = tableName; _trackingTable = trackingTable; _targetTableColumns = targetTableColumns; _params = updateParameters; }
public CreateTrackingTable(string schema, string tableName, string trackingTableName, List<SchemaDataSet.ColumnsRow> targetTableColumns, AuditUpdateParameters updateParameters) { _schema = schema; _tableName = tableName; _trackingTableName = trackingTableName; _targetTableColumns = targetTableColumns; _params = updateParameters; }
private static List<SchemaDataSet.ColumnsRow> GetAuditedColumnsForTable(string schema, string tableName, AuditUpdateParameters updateParameters) { StringCollection columnsNotAudited = updateParameters.ColumnsNotAudited; IEnumerable<SchemaDataSet.ColumnsRow> columnsRows = GetColumnsForTable(schema, tableName, updateParameters); IEnumerable<SchemaDataSet.ColumnsRow> query = from columnRow in columnsRows where !(columnsNotAudited.Cast<string>().Any(columnName => columnName.Equals(columnRow.COLUMN_NAME, StringComparison.OrdinalIgnoreCase))) select columnRow; return query.ToList(); }
public CreateTrackingInsertProcedure(string schema, string auditedTable, string trackingTableName, string deltaTableName, List<SchemaDataSet.ColumnsRow> targetTableColumns, AuditUpdateParameters updateParameters) { _schema = schema; _auditedTable = auditedTable; _trackingTableName = trackingTableName; _deltaTableName = deltaTableName; _targetTableColumns = targetTableColumns; _params = updateParameters; }
private static void GenerateAuditMasterTable(StringBuilder sqlBuilder, AuditUpdateParameters updateParameters) { SchemaDataSet schemaDataSet = updateParameters.SchemaDataSet; if (!schemaDataSet.SchemaTables.TableExists(updateParameters.AuditingSchema, "AuditMaster")) { CreateAuditMasterTable createAuditMasterTableTemplate = new CreateAuditMasterTable(updateParameters); string sql = createAuditMasterTableTemplate.TransformText(); sqlBuilder.AppendLine(sql); } }
private static void GenerateTransactionSequenceTable(StringBuilder sqlBuilder, AuditUpdateParameters updateParameters) { SchemaDataSet schemaDataSet = updateParameters.SchemaDataSet; if (!schemaDataSet.SchemaTables.TableExists(updateParameters.AuditingSchema, "TransactionSequence")) { CreateTransactionSequenceTable createTransactionSequenceTable = new CreateTransactionSequenceTable(updateParameters); string sql = createTransactionSequenceTable.TransformText(); sqlBuilder.AppendLine(sql); } }
internal static IEnumerable<SchemaDataSet.ColumnsRow> GetColumnsForTable(string schema, string tableName, AuditUpdateParameters updateParameters) { SchemaDataSet schemaDataSet = updateParameters.SchemaDataSet; SchemaDataSet.ColumnsDataTable columnsDataTable = schemaDataSet.Columns; IEnumerable<SchemaDataSet.ColumnsRow> columnsRows = columnsDataTable.Rows.Cast<SchemaDataSet.ColumnsRow>(); IEnumerable<SchemaDataSet.ColumnsRow> query = from columnRow in columnsRows where columnRow.TABLE_SCHEMA.Equals(schema, StringComparison.OrdinalIgnoreCase) && columnRow.TABLE_NAME.Equals(tableName, StringComparison.OrdinalIgnoreCase) orderby columnRow.ORDINAL_POSITION select columnRow; return query; }
internal static void CreateBaseAuditingTables(StringBuilder sqlBuilder, AuditUpdateParameters updateParameters, Action<string, float?> reportProgress) { GenerateCatalogTable(sqlBuilder, updateParameters); reportProgress("Generated Catalog table", null); GenerateActionCodesTable(sqlBuilder, updateParameters); reportProgress("Generated ActionCodes table", null); GenerateTransactionSequenceTable(sqlBuilder, updateParameters); reportProgress("Generated TransactionSequence table", null); GenerateSessionTransactionTable(sqlBuilder, updateParameters); reportProgress("Generated SessionTransaction table", null); GenerateAuditMasterTable(sqlBuilder, updateParameters); reportProgress("Generated AuditMaster table", null); }
internal static void GenerateAuditSupportForTable(string schema, string tableName, TrackingTable trackingTable, StringBuilder sqlBuilder, List<SchemaDataSet.ColumnsRow> targetTableColumns, AuditUpdateParameters updateParameters, Action<string, float?> reportProgress) { string trackingTableName = trackingTable.ToString(); string deltaTableName = trackingTableName + "Δ"; CreateDeltaTable createDeltaTableTemplate = new CreateDeltaTable(trackingTableName + "Δ", targetTableColumns, updateParameters); string sql = createDeltaTableTemplate.TransformText(); sqlBuilder.AppendLine(sql); GenerateAuditTableInsertProcedures(schema, tableName, trackingTableName, deltaTableName, targetTableColumns, sqlBuilder, updateParameters, reportProgress); if (updateParameters.GenerateBaseline) { Baseline(schema, tableName, trackingTable, targetTableColumns, sqlBuilder, updateParameters, reportProgress); } GenerateAuditTableTriggers(schema, tableName, sqlBuilder, updateParameters, reportProgress); }
public string GenerateAuditingFrameworkUpdateSql(AuditUpdateParameters updateParameters) { StringBuilder sqlBuilder = new StringBuilder(); Action<string, float?> reportProgress = (message, percentComplete) => { sqlBuilder.AppendLine(); sqlBuilder.AppendFormat("PRINT(N'{0}');", message); sqlBuilder.AppendLine(); sqlBuilder.AppendLine("GO"); OnReportProgress(message, percentComplete); }; SqlConnection connection = updateParameters.AuditingDatabaseConnection; try { OnReportProgress("Started generating script", null); connection.Open(); if (updateParameters.RemoveAll) { GenerateRemoveAll(sqlBuilder, updateParameters); } else { LoadSchemaDataSet(updateParameters); GenerateDatabaseFiles.GenerateDatabaseSetup(sqlBuilder, updateParameters, reportProgress); GenerateAuditingBase.CreateBaseAuditingTables(sqlBuilder, updateParameters, reportProgress); GenerateAuditingBase.CreateBaseAuditingProcedures(sqlBuilder, updateParameters, reportProgress); GenerateAuditingBase.CreateProcedureGrant(sqlBuilder, updateParameters, reportProgress); GenerateSchemaAudit.GenerateAuditForAllSchemas(sqlBuilder, updateParameters, reportProgress); GenerateDelta.GenerateBuildAllDeltaProcedures(sqlBuilder, updateParameters, reportProgress); } } finally { if (connection.State != ConnectionState.Closed) { connection.Close(); } } return sqlBuilder.ToString(); }
internal static void GenerateDatabaseSetup(StringBuilder sqlBuilder, AuditUpdateParameters updateParameters, Action<string, float?> reportProgress) { Server server = new Server(updateParameters.AuditingDatabaseConnection.DataSource); Database database = server.Databases[updateParameters.AuditingDatabaseConnection.Database]; if (!database.FileGroups.Contains(updateParameters.AuditingFileGroup)) { DataFile dataFile = database.FileGroups[0].Files[0]; string fileName = dataFile.FileName; string path = Path.GetDirectoryName(fileName); if (path == null) { throw new InvalidOperationException("Can't determine path of database file"); } updateParameters.SqlFilePath = new DirectoryInfo(path); SetupDatabase setupDatabaseTemplate = new SetupDatabase(updateParameters); string text = setupDatabaseTemplate.TransformText(); sqlBuilder.AppendLine(text); } reportProgress("Generated database setup", null); }
/// <summary> /// Determines whether a new tracking table should be built and catalogued /// </summary> /// <param name="schema">The name of the audited schema</param> /// <param name="tableName">The name of the audited table to check</param> /// <param name="targetTableColumns">A list of the columns in the audited table</param> /// <param name="updateParameters">Generator parameters</param> /// <returns>True of the audited table has different columns (name or type) than the tracking table</returns> /// <remarks> /// This routine only checks the column names and data types for a match. A change to indexes, relationships, and keys will not affect /// the comparison. /// </remarks> private static bool NewVersionOfTrackingTableNeeded(string schema, string tableName, ICollection<SchemaDataSet.ColumnsRow> targetTableColumns, AuditUpdateParameters updateParameters) { // check whether we even have a tracking table TrackingTable trackingTable = GenerateTableTracking.GetCurrentTrackingTable(schema, tableName, updateParameters); if (null == trackingTable) { return true; } // get the columns from the tracking table List<SchemaDataSet.ColumnsRow> trackingTableColumns = GetTrackingColumnsForTable(trackingTable, updateParameters); // check whether the number of columns match if (targetTableColumns.Count != trackingTableColumns.Count) { return true; } // compare each column return AllColumnsMatch(targetTableColumns, trackingTableColumns); }
internal static TrackingTable GenerateAuditForTable(string schema, string tableName, SchemaDataSet.SchemaPrimaryKeysDataTable primaryKeysDataTable, StringBuilder sqlBuilder, AuditUpdateParameters updateParameters, Action<string, float?> reportProgress) { TrackingTable trackingTable; reportProgress(String.Format("Generating audit for table {0}", tableName), null); List<SchemaDataSet.ColumnsRow> targetTableColumns = GetAuditedColumnsForTable(schema, tableName, updateParameters); bool createNewTableVersion = NewVersionOfTrackingTableNeeded(schema, tableName, targetTableColumns, updateParameters); if (createNewTableVersion) { trackingTable = GenerateTableTracking.GenerateNewTrackingTable(schema, tableName, targetTableColumns, updateParameters, sqlBuilder, reportProgress); } else { trackingTable = GenerateTableTracking.GetCurrentTrackingTable(schema, tableName, updateParameters); } GenerateTableTracking.GenerateAuditSupportForTable(schema, tableName, trackingTable, sqlBuilder, targetTableColumns, updateParameters, reportProgress); GenerateTableTracking.GenerateInstantSupportForTable(schema, tableName, sqlBuilder, updateParameters); GenerateDelta.CreateDeltaProcedures(schema, tableName, trackingTable, targetTableColumns, sqlBuilder, updateParameters, reportProgress); reportProgress(String.Format("Generated audit for table {0}", tableName), null); return trackingTable; }
internal static TrackingTable GenerateNewTrackingTable(string schema, string tableName, List<SchemaDataSet.ColumnsRow> targetTableColumns, AuditUpdateParameters updateParameters, StringBuilder sqlBuilder, Action<string, float?> reportProgress) { int version; SchemaDataSet schemaDataSet = updateParameters.SchemaDataSet; if (schemaDataSet.SchemaTables.TableExists(updateParameters.AuditingSchema, "Catalog")) { EntityConnectionStringBuilder connectionStringBuilder = Generator.GetEntityConnectionStringBuilder(updateParameters); AuditFrameworkEntities context = new AuditFrameworkEntities(connectionStringBuilder.ToString()); var catalogQuery = from catalog in context.Catalogs where catalog.AuditedSchema.Equals(schema, StringComparison.OrdinalIgnoreCase) && catalog.AuditedTableName.Equals(tableName, StringComparison.OrdinalIgnoreCase) orderby catalog.Version descending select catalog; var latestCatalog = catalogQuery.FirstOrDefault(); if (null == latestCatalog) { version = 0; } else { version = latestCatalog.Version + 1; } } else { version = 0; } TrackingTable trackingTable = new TrackingTable(schema, tableName, version); string trackingTableName = trackingTable.ToString(); InsertCatalog insertCatalogTemplate = new InsertCatalog(schema, tableName, version, updateParameters.AuditingSchema, trackingTableName); string sql = insertCatalogTemplate.TransformText(); sqlBuilder.AppendLine(sql); CreateTrackingTable createTrackingTableTemplate = new CreateTrackingTable(schema, tableName, trackingTableName, targetTableColumns, updateParameters); sql = createTrackingTableTemplate.TransformText(); sqlBuilder.AppendLine(sql); return trackingTable; }
internal static TrackingTable GetCurrentTrackingTable(string schema, string tableName, AuditUpdateParameters updateParameters) { SchemaDataSet schemaDataSet = updateParameters.SchemaDataSet; if (schemaDataSet.SchemaTables.TableExists(updateParameters.AuditingSchema, "Catalog")) { EntityConnectionStringBuilder connectionStringBuilder = Generator.GetEntityConnectionStringBuilder(updateParameters); AuditFrameworkEntities context = new AuditFrameworkEntities(connectionStringBuilder.ToString()); var catalogQuery = from catalog in context.Catalogs where catalog.AuditedSchema.Equals(schema, StringComparison.OrdinalIgnoreCase) && catalog.AuditedTableName.Equals(tableName, StringComparison.OrdinalIgnoreCase) orderby catalog.Version descending select catalog; Catalog catalogRow = catalogQuery.FirstOrDefault(); if (null == catalogRow) { return null; } TrackingTable trackingTable = TrackingTable.Parse(catalogRow.AuditingTableName); return trackingTable; } return null; }
internal static void GenerateBuildAllDeltaProcedures(StringBuilder sqlBuilder, AuditUpdateParameters updateParameters, Action<string, float?> reportProgress) { CreateBuildDeltaProcedure createBuildDeltaProcedureTemplate = new CreateBuildDeltaProcedure(updateParameters); string sql = createBuildDeltaProcedureTemplate.TransformText(); sqlBuilder.AppendLine(sql); }
public CreateAuditMasterTable(AuditUpdateParameters updateParameters) { _params = updateParameters; }
public CreateActionCodesTable(AuditUpdateParameters updateParameters) { _params = updateParameters; }
public SetupDatabase(AuditUpdateParameters updateParameters) { _params = updateParameters; }
public CreateDeltaTable(string deltaTableName, List<SchemaDataSet.ColumnsRow> targetTableColumns, AuditUpdateParameters updateParameters) { _deltaTableName = deltaTableName; _targetTableColumns = targetTableColumns; _params = updateParameters; }
public CreateReleaseTransactionSequenceProcedure(AuditUpdateParameters updateParameters) { _params = updateParameters; }
private static void Baseline(string schema, string tableName, TrackingTable trackingTable, List<SchemaDataSet.ColumnsRow> targetTableColumns, StringBuilder sqlBuilder, AuditUpdateParameters updateParameters, Action<string, float?> reportProgress) { reportProgress(string.Format("Starting to set baseline records for {0}.{1}", schema, tableName), null); SetBaseline performBaseLineTemplate = new SetBaseline(schema, tableName, trackingTable, targetTableColumns, updateParameters); string sql = performBaseLineTemplate.TransformText(); sqlBuilder.AppendLine(sql); reportProgress(string.Format("Finished setting baseline records for {0}.{1}", schema, tableName), null); }
private static void GenerateAuditTableInsertProcedures(string schema, string tableName, string trackingTableName, string deltaTableName, List<SchemaDataSet.ColumnsRow> targetTableColumns, StringBuilder sqlBuilder, AuditUpdateParameters updateParameters, Action<string, float?> reportProgress) { reportProgress(string.Format("Generating TrackingInsert Procedure for {0}.{1}", schema, tableName), null); CreateTrackingInsertProcedure createTrackingInsertProcedureTemplate = new CreateTrackingInsertProcedure(schema, tableName, trackingTableName, deltaTableName, targetTableColumns, updateParameters); string sql = createTrackingInsertProcedureTemplate.TransformText(); sqlBuilder.AppendLine(sql); reportProgress(string.Format("Generated TrackingInsert Procedure for {0}.{1}", schema, tableName), null); }
public static void GenerateInstantSupportForTable(string schema, string tableName, StringBuilder sqlBuilder, AuditUpdateParameters updateParameters) { CreateInstantTrackIdProcedure createInstantTrackIdProcedureTemplate = new CreateInstantTrackIdProcedure(schema, tableName, updateParameters); string sql = createInstantTrackIdProcedureTemplate.TransformText(); sqlBuilder.AppendLine(sql); }
private static void GenerateAuditTableTriggers(string schema, string tableName, StringBuilder sqlBuilder, AuditUpdateParameters updateParameters, Action<string, float?> reportProgress) { reportProgress(string.Format("Generating Triggers for {0}.{1}", schema, tableName), null); CreateTrigger triggerTemplate = new CreateTrigger(schema, tableName, updateParameters); string sql = triggerTemplate.TransformText(); sqlBuilder.AppendLine(sql); reportProgress(string.Format("Generated Triggers for {0}.{1}", schema, tableName), null); }