Beispiel #1
0
/*
 *      private SQLScriptList BuildSQLFileGroup()
 *      {
 *          var listDiff = new SQLScriptList();
 *
 *          Boolean found = false;
 *          Index clustered = Indexes.Find(item => item.Type == Index.IndexTypeEnum.Clustered);
 *          if (clustered == null)
 *          {
 *              foreach (Constraint cons in Constraints)
 *              {
 *                  if (cons.Index.Type == Index.IndexTypeEnum.Clustered)
 *                  {
 *                      listDiff.Add(cons.ToSqlDrop(FileGroup), dependenciesCount, Enums.ScripActionType.DropConstraint);
 *                      listDiff.Add(cons.ToSqlAdd(), dependenciesCount, Enums.ScripActionType.AddConstraint);
 *                      found = true;
 *                  }
 *              }
 *              if (!found)
 *              {
 *                  Status = Enums.ObjectStatusType.RebuildStatus;
 *                  listDiff = ToSqlDiff();
 *              }
 *          }
 *          else
 *          {
 *              listDiff.Add(clustered.ToSqlDrop(FileGroup), dependenciesCount, Enums.ScripActionType.DropIndex);
 *              listDiff.Add(clustered.ToSqlAdd(), dependenciesCount, Enums.ScripActionType.AddIndex);
 *          }
 *          return listDiff;
 *      }
 */

        /// <summary>
        /// Devuelve el schema de diferencias de la tabla en formato SQL.
        /// </summary>
        public override SQLScriptList ToSqlDiff()
        {
            var listDiff = new SQLScriptList();

            if (Status != Enums.ObjectStatusType.OriginalStatus)
            {
                if (((Database)Parent).Options.Ignore.FilterTable)
                {
                    RootParent.ActionMessage.Add(this);
                }
            }

            if (Status == Enums.ObjectStatusType.DropStatus)
            {
                if (((Database)Parent).Options.Ignore.FilterTable)
                {
                    listDiff.Add(ToSqlDrop(), dependenciesCount, Enums.ScripActionType.DropTable);
                    listDiff.AddRange(ToSQLDropFKBelow());
                }
            }
            if (Status == Enums.ObjectStatusType.CreateStatus)
            {
                string sql = "";
                Constraints.ForEach(item =>
                {
                    if (item.Type == Constraint.ConstraintType.ForeignKey)
                    {
                        sql += item.ToSqlAdd() + "\r\n";
                    }
                });
                listDiff.Add(ToSql(false), dependenciesCount, Enums.ScripActionType.AddTable);
                listDiff.Add(sql, dependenciesCount, Enums.ScripActionType.AddConstraintFK);
            }
            if (HasState(Enums.ObjectStatusType.RebuildDependenciesStatus))
            {
                GenerateDependencis();
                listDiff.AddRange(ToSQLDropDependencis());
                listDiff.AddRange(columns.ToSqlDiff());
                listDiff.AddRange(ToSQLCreateDependencis());
                listDiff.AddRange(Constraints.ToSqlDiff());
                listDiff.AddRange(Indexes.ToSqlDiff());
                listDiff.AddRange(Options.ToSqlDiff());
                listDiff.AddRange(Triggers.ToSqlDiff());
                listDiff.AddRange(CLRTriggers.ToSqlDiff());
                listDiff.AddRange(FullTextIndex.ToSqlDiff());
            }
            if (HasState(Enums.ObjectStatusType.AlterStatus))
            {
                listDiff.AddRange(columns.ToSqlDiff());
                listDiff.AddRange(Constraints.ToSqlDiff());
                listDiff.AddRange(Indexes.ToSqlDiff());
                listDiff.AddRange(Options.ToSqlDiff());
                listDiff.AddRange(Triggers.ToSqlDiff());
                listDiff.AddRange(CLRTriggers.ToSqlDiff());
                listDiff.AddRange(FullTextIndex.ToSqlDiff());
            }
            if (HasState(Enums.ObjectStatusType.RebuildStatus))
            {
                GenerateDependencis();
                listDiff.AddRange(ToSQLRebuild());
                listDiff.AddRange(columns.ToSqlDiff());
                listDiff.AddRange(Constraints.ToSqlDiff());
                listDiff.AddRange(Indexes.ToSqlDiff());
                listDiff.AddRange(Options.ToSqlDiff());
                //Como recrea la tabla, solo pone los nuevos triggers, por eso va ToSQL y no ToSQLDiff
                listDiff.Add(Triggers.ToSql(), dependenciesCount, Enums.ScripActionType.AddTrigger);
                listDiff.Add(CLRTriggers.ToSql(), dependenciesCount, Enums.ScripActionType.AddTrigger);
                listDiff.AddRange(FullTextIndex.ToSqlDiff());
            }
            if (HasState(Enums.ObjectStatusType.DisabledStatus))
            {
                listDiff.Add(ToSqlChangeTracking(), 0, Enums.ScripActionType.AlterTableChangeTracking);
            }
            return(listDiff);
        }