private PrimaryKeyDetail GetPrimaryKeyDetails(string schemaName, string tableName, string constraintName, bool disabled) { return(new PrimaryKeyDetail(SelectSqlData.GetIndex(schemaName, tableName, constraintName, disabled, Connection))); }
private IEnumerable <ConstraintDetail> GetConstraintDetails(string schemaName, string tableName, string columnName, string inboundForeignKey) { string databaseName = Connection.Database; using (var constraintReader = SelectSqlData.SelectIndexesConstraintsAndStatistics(Connection, tableName, columnName)) { while (constraintReader.Read()) { string constraintType = constraintReader["constraint_type"] as string; string constraintName = constraintReader["index_name"] as string; string constraintData = constraintReader["data"] as string; bool disabled = (int)constraintReader["is_disabled"] > 0; bool untrusted = (int)constraintReader["is_not_trusted"] > 0; switch (constraintType) { case "FK_IN": // it's a foreign key reference from this column if (!StringComparer.OrdinalIgnoreCase.Equals(constraintName, inboundForeignKey)) { throw new Exception( $"Column {databaseName}.{schemaName}.{tableName}.{columnName} is referenced by foreign key {constraintName} which comes from column {constraintData} - recursion should start from at least there."); } break; case null: // it's an index yield return(new IndexDetail(SelectSqlData.GetIndex(schemaName, tableName, constraintName, disabled, Connection))); break; case "PK": // it's a primary key constraint yield return(GetPrimaryKeyDetails(schemaName, tableName, constraintName, disabled)); break; case "UQ": // it's a unique constraint yield return(GetUniqueConstraintDetails(schemaName, tableName, constraintName, disabled)); break; case "D": // it's a default constraint yield return(GetDefaultConstraintDetails(constraintName, schemaName, tableName, columnName, constraintData)); break; case "C": // it's a check constraint yield return(GetCheckConstraintDetails(constraintName, schemaName, tableName, columnName, constraintData, untrusted, disabled)); break; case "FK": // it's a foreign key reference into this column yield return(SelectSqlData.GetForeignKeyDetails(schemaName, tableName, constraintName, untrusted, disabled, Connection)); break; case "STAT": // it's a statistics object on this column yield return(SelectSqlData.GetStatisticsDetails(schemaName, tableName, constraintName, Connection)); break; } } yield break; } }