internal static string GenerateAuditScript(string storageConnectionString, ScriptAction scriptAction, ProgressChangeDelegate progressChangeDelegate)
        {
            //Set Audit Settings
            SqlAuditSettings myAuditSettings = new SqlAuditSettings(storageConnectionString);

            //Choose Script MMC.SyncAction
            myAuditSettings.ScriptAction = scriptAction;

            //Select Audit Columns
            myAuditSettings.AuditColumns = AuditColumns.ApplicationName | AuditColumns.AuditDateTime | AuditColumns.HostId | AuditColumns.HostName | AuditColumns.UserName | AuditColumns.UserSID;

            //Choose Triggers MMC.SyncAction
            myAuditSettings.TriggersActions = TriggerActions.Insert | TriggerActions.Update | TriggerActions.Delete;

            //Choose Indexes MMC.SyncAction
            myAuditSettings.IndexesAction = IndexesAction.SameIndexesAsSourceTable;

            //Assign naming properties
            myAuditSettings.AuditTablesSuffix   = "_Audit";
            myAuditSettings.AuditTriggersSuffix = "_TriggerForAudit";

            //Define File Groups
            myAuditSettings.TablesFileGroupName  = "[PRIMARY]";
            myAuditSettings.IndexesFileGroupName = "[PRIMARY]";

            //Use SqlAuditDiscovery Class to get Table Schemas.
            SqlAuditDiscovery auditDiscoveryUtility = new SqlAuditDiscovery(storageConnectionString);

            //Get TableInfo Collection
            TableInfoCollection myTables = auditDiscoveryUtility.GetAllTableInfo(myAuditSettings);

            //*** Tables Customization ***//
            myTables.Remove(new SchemaTablePair("dbo", "UsersDemo"));
            myTables.Remove(new SchemaTablePair("dbo", "netsqlazman_LogTable"));



            //Generate Audit Script
            SqlAuditGenerator generator = new SqlAuditGenerator(myAuditSettings);

            generator.ProgressChange += progressChangeDelegate;
            return(generator.GenerateDDLScriptForAuditTables(myTables));
        }
 /// <summary>
 ///     Sort the input table by DependenceIndex
 /// </summary>
 /// <param name="this"></param>
 /// <param name="tableNames"></param>
 /// <returns></returns>
 public static string[] SortByDependences(this TableInfoCollection @this, params string[] tableNames)
 => tableNames.OrderBy(t => @this[t]?.DependenceIndex ?? 0).ToArray();
 public static IList <TableInfo> SortByDependences(this TableInfoCollection @this)
 => @this.OrderBy(t => t.DependenceIndex).ToList();
 public static IEnumerable <TableInfo> GetTableInfoByName(this TableInfoCollection @this,
                                                          params string[] tableNames)
 => @this.Where(t => tableNames.Any(s => s == t.Name));