Initial commit
This commit is contained in:
191
OpenDBDiff.Schema.SQLServer.Generates/Generates/Generate.cs
Normal file
191
OpenDBDiff.Schema.SQLServer.Generates/Generates/Generate.cs
Normal file
@@ -0,0 +1,191 @@
|
||||
using OpenDBDiff.Schema.Errors;
|
||||
using OpenDBDiff.Schema.Events;
|
||||
using OpenDBDiff.Schema.Misc;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Compare;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Options;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.SqlClient;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class Generate
|
||||
{
|
||||
private readonly List<MessageLog> messages;
|
||||
private ProgressEventArgs currentlyReading;
|
||||
|
||||
public Generate()
|
||||
{
|
||||
messages = new List<MessageLog>();
|
||||
OnReading += Generate_OnReading;
|
||||
}
|
||||
|
||||
public static int MaxValue
|
||||
{
|
||||
get { return Constants.READING_MAX; }
|
||||
}
|
||||
|
||||
public string ConnectionString { get; set; }
|
||||
|
||||
private string Name
|
||||
{
|
||||
get
|
||||
{
|
||||
string name;
|
||||
using (var conn = new SqlConnection(ConnectionString))
|
||||
{
|
||||
name = conn.Database;
|
||||
}
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
public SqlOption Options { get; set; }
|
||||
|
||||
private event ProgressEventHandler.ProgressHandler OnReading;
|
||||
|
||||
public event ProgressEventHandler.ProgressHandler OnProgress;
|
||||
|
||||
private void Generate_OnReading(ProgressEventArgs e)
|
||||
{
|
||||
if (OnProgress != null) OnProgress(e);
|
||||
}
|
||||
|
||||
public void RaiseOnReading(ProgressEventArgs e)
|
||||
{
|
||||
this.currentlyReading = e;
|
||||
if (OnReading != null) OnReading(e);
|
||||
}
|
||||
|
||||
public void RaiseOnReadingOne(object name)
|
||||
{
|
||||
if (name != null && this.OnReading != null && this.currentlyReading != null)
|
||||
{
|
||||
var eOne = new ProgressEventArgs(this.currentlyReading.Message, this.currentlyReading.Progress);
|
||||
eOne.Message = eOne.Message.Replace("...", String.Format(": [{0}]", name));
|
||||
this.OnReading(eOne);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Genera el schema de la base de datos seleccionada y devuelve un objeto Database.
|
||||
/// </summary>
|
||||
public Database Process()
|
||||
{
|
||||
string error = "";
|
||||
var databaseSchema = new Database();
|
||||
|
||||
//tables.OnTableProgress += new Progress.ProgressHandler(tables_OnTableProgress);
|
||||
databaseSchema.Options = Options;
|
||||
databaseSchema.Name = Name;
|
||||
databaseSchema.Info = (new GenerateDatabase(ConnectionString, Options)).Get(databaseSchema);
|
||||
/*Thread t1 = new Thread(delegate()
|
||||
{
|
||||
try
|
||||
{*/
|
||||
(new GenerateRules(this)).Fill(databaseSchema, ConnectionString);
|
||||
(new GenerateTables(this)).Fill(databaseSchema, ConnectionString, messages);
|
||||
(new GenerateViews(this)).Fill(databaseSchema, ConnectionString, messages);
|
||||
|
||||
if (Options.Ignore.FilterIndex)
|
||||
{
|
||||
(new GenerateIndex(this)).Fill(databaseSchema, ConnectionString);
|
||||
(new GenerateFullTextIndex(this)).Fill(databaseSchema, ConnectionString);
|
||||
}
|
||||
(new GenerateUserDataTypes(this)).Fill(databaseSchema, ConnectionString, messages);
|
||||
(new GenerateXMLSchemas(this)).Fill(databaseSchema, ConnectionString);
|
||||
(new GenerateSchemas(this)).Fill(databaseSchema, ConnectionString);
|
||||
/*}
|
||||
catch (Exception ex)
|
||||
{
|
||||
error = ex.StackTrace;
|
||||
}
|
||||
});
|
||||
Thread t2 = new Thread(delegate()
|
||||
{
|
||||
try
|
||||
{*/
|
||||
|
||||
//not supported in azure yet
|
||||
if (databaseSchema.Info.Version != DatabaseInfo.SQLServerVersion.SQLServerAzure10)
|
||||
{
|
||||
(new GeneratePartitionFunctions(this)).Fill(databaseSchema, ConnectionString);
|
||||
(new GeneratePartitionScheme(this)).Fill(databaseSchema, ConnectionString);
|
||||
(new GenerateFileGroups(this)).Fill(databaseSchema, ConnectionString);
|
||||
}
|
||||
|
||||
(new GenerateDDLTriggers(this)).Fill(databaseSchema, ConnectionString);
|
||||
(new GenerateSynonyms(this)).Fill(databaseSchema, ConnectionString);
|
||||
|
||||
//not supported in azure yet
|
||||
if (databaseSchema.Info.Version != DatabaseInfo.SQLServerVersion.SQLServerAzure10)
|
||||
{
|
||||
(new GenerateAssemblies(this)).Fill(databaseSchema, ConnectionString);
|
||||
(new GenerateFullText(this)).Fill(databaseSchema, ConnectionString);
|
||||
}
|
||||
/*}
|
||||
catch (Exception ex)
|
||||
{
|
||||
error = ex.StackTrace;
|
||||
}
|
||||
});
|
||||
Thread t3 = new Thread(delegate()
|
||||
{
|
||||
try
|
||||
{*/
|
||||
(new GenerateStoredProcedures(this)).Fill(databaseSchema, ConnectionString);
|
||||
(new GenerateFunctions(this)).Fill(databaseSchema, ConnectionString);
|
||||
(new GenerateTriggers(this)).Fill(databaseSchema, ConnectionString, messages);
|
||||
(new GenerateTextObjects(this)).Fill(databaseSchema, ConnectionString);
|
||||
(new GenerateUsers(this)).Fill(databaseSchema, ConnectionString);
|
||||
/*}
|
||||
catch (Exception ex)
|
||||
{
|
||||
error = ex.StackTrace;
|
||||
}
|
||||
});
|
||||
t1.Start();
|
||||
t2.Start();
|
||||
t3.Start();
|
||||
t1.Join();
|
||||
t2.Join();
|
||||
t3.Join();*/
|
||||
if (String.IsNullOrEmpty(error))
|
||||
{
|
||||
/*Las propiedades extendidas deben ir despues de haber capturado el resto de los objetos de la base*/
|
||||
(new GenerateExtendedProperties(this)).Fill(databaseSchema, ConnectionString, messages);
|
||||
databaseSchema.BuildDependency();
|
||||
return databaseSchema;
|
||||
}
|
||||
else
|
||||
throw new SchemaException(error);
|
||||
}
|
||||
|
||||
private void tables_OnTableProgress(object sender, ProgressEventArgs e)
|
||||
{
|
||||
ProgressEventHandler.RaiseOnChange(e);
|
||||
}
|
||||
|
||||
// TODO: Static because Compare method is static; static events are not my favorite
|
||||
public static event ProgressEventHandler.ProgressHandler OnCompareProgress;
|
||||
|
||||
internal static void RaiseOnCompareProgress(string formatString, params object[] formatParams)
|
||||
{
|
||||
OnCompareProgress?.Invoke(new ProgressEventArgs(String.Format(formatString, formatParams), -1));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generates the differences to migrate a schema from origin to destination
|
||||
/// </summary>
|
||||
/// <param name="origin">The Origin schema is the schema before our generated actions are applied.</param>
|
||||
/// <param name="destination">The Destination schema is the schema after our actions are applied.</param>
|
||||
/// <returns></returns>
|
||||
public static Database Compare(Database origin, Database destination)
|
||||
{
|
||||
Database merge = CompareDatabase.GenerateDifferences(origin, destination);
|
||||
return merge;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
using System;
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateAssemblies
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateAssemblies(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQLFiles()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetAssemblyFiles");
|
||||
}
|
||||
|
||||
private static string GetSQL()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetAssemblies");
|
||||
}
|
||||
|
||||
private static string ToHex(byte[] stream)
|
||||
{
|
||||
return ByteToHexEncoder.ByteArrayToHex(stream);
|
||||
}
|
||||
|
||||
private static void FillFiles(Database database, string connectionString)
|
||||
{
|
||||
if (database.Options.Ignore.FilterAssemblies)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQLFiles(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
if (((int)reader["FileId"]) != 1)
|
||||
{
|
||||
Assembly assem = database.Assemblies[reader["Name"].ToString()];
|
||||
AssemblyFile file = new AssemblyFile(assem, reader["FileName"].ToString(), ToHex((byte[])reader["FileContent"]));
|
||||
assem.Files.Add(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public void Fill(Database database, string connectionString)
|
||||
{
|
||||
int lastViewId = 0;
|
||||
if (database.Options.Ignore.FilterAssemblies)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQL(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
Assembly item = null;
|
||||
while (reader.Read())
|
||||
{
|
||||
if (lastViewId != (int)reader["assembly_id"])
|
||||
{
|
||||
item = new Assembly(database)
|
||||
{
|
||||
Id = (int)reader["assembly_id"],
|
||||
Name = reader["Name"].ToString(),
|
||||
Owner = reader["Owner"].ToString(),
|
||||
CLRName = reader["clr_name"].ToString(),
|
||||
PermissionSet = reader["permission_set_desc"].ToString(),
|
||||
Text = ToHex((byte[])reader["content"]),
|
||||
Visible = (bool)reader["is_visible"]
|
||||
};
|
||||
lastViewId = item.Id;
|
||||
database.Assemblies.Add(item);
|
||||
}
|
||||
if (!String.IsNullOrEmpty(reader["Dependency"].ToString()))
|
||||
item.DependenciesOut.Add(reader["Dependency"].ToString());
|
||||
if (!String.IsNullOrEmpty(reader["ObjectDependency"].ToString()))
|
||||
item.DependenciesOut.Add(reader["ObjectDependency"].ToString());
|
||||
if (!String.IsNullOrEmpty(reader["UDTName"].ToString()))
|
||||
item.DependenciesOut.Add(reader["UDTName"].ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
FillFiles(database, connectionString);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,303 @@
|
||||
using System;
|
||||
using System.Data.SqlClient;
|
||||
using System.Text;
|
||||
using OpenDBDiff.Schema.Events;
|
||||
using OpenDBDiff.Schema.Model;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateConstraint
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateConstraint(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
#region Check Functions...
|
||||
public void FillCheck(Database database, string connectionString)
|
||||
{
|
||||
int parentId = 0;
|
||||
ISchemaBase table = null;
|
||||
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(ConstraintSQLCommand.GetCheck(database.Info.Version), conn))
|
||||
{
|
||||
root.RaiseOnReading(new ProgressEventArgs("Reading constraint...", Constants.READING_CONSTRAINTS));
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
Constraint item = null;
|
||||
while (reader.Read())
|
||||
{
|
||||
root.RaiseOnReadingOne(reader["Name"]);
|
||||
if (parentId != (int)reader["parent_object_id"])
|
||||
{
|
||||
parentId = (int)reader["parent_object_id"];
|
||||
if (reader["ObjectType"].ToString().Trim().Equals("U"))
|
||||
table = database.Tables.Find(parentId);
|
||||
else
|
||||
table = database.TablesTypes.Find(parentId);
|
||||
}
|
||||
if (table != null)
|
||||
{
|
||||
item = new Constraint(table);
|
||||
item.Id = (int)reader["id"];
|
||||
item.Name = reader["Name"].ToString();
|
||||
item.Type = Constraint.ConstraintType.Check;
|
||||
item.Definition = reader["Definition"].ToString();
|
||||
item.WithNoCheck = (bool)reader["WithCheck"];
|
||||
item.IsDisabled = (bool)reader["is_disabled"];
|
||||
item.Owner = reader["Owner"].ToString();
|
||||
if (database.Options.Ignore.FilterNotForReplication)
|
||||
item.NotForReplication = (bool)reader["is_not_for_replication"];
|
||||
if (reader["ObjectType"].ToString().Trim().Equals("U"))
|
||||
((Table)table).Constraints.Add(item);
|
||||
else
|
||||
((TableType)table).Constraints.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region ForeignKey Functions...
|
||||
|
||||
private static string GetSQLForeignKey()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetForeignKeys");
|
||||
}
|
||||
|
||||
private static void FillForeignKey(Database database, string connectionString)
|
||||
{
|
||||
int lastid = 0;
|
||||
int parentId = 0;
|
||||
Table table = null;
|
||||
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQLForeignKey(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
Constraint con = null;
|
||||
while (reader.Read())
|
||||
{
|
||||
if (parentId != (int)reader["parent_object_id"])
|
||||
{
|
||||
parentId = (int)reader["parent_object_id"];
|
||||
table = database.Tables.Find(parentId);
|
||||
}
|
||||
|
||||
if (table != null)
|
||||
{
|
||||
if (lastid != (int)reader["object_id"])
|
||||
{
|
||||
con = new Constraint(table);
|
||||
con.Id = (int)reader["object_id"];
|
||||
con.Name = reader["Name"].ToString();
|
||||
con.Type = Constraint.ConstraintType.ForeignKey;
|
||||
con.WithNoCheck = (bool)reader["is_not_trusted"];
|
||||
con.RelationalTableFullName = "[" + reader["ReferenceOwner"].ToString() + "].[" + reader["TableRelationalName"].ToString() + "]";
|
||||
con.RelationalTableId = (int)reader["TableRelationalId"];
|
||||
con.Owner = reader["Owner"].ToString();
|
||||
con.IsDisabled = (bool)reader["is_disabled"];
|
||||
con.OnDeleteCascade = (byte)reader["delete_referential_action"];
|
||||
con.OnUpdateCascade = (byte)reader["update_referential_action"];
|
||||
if (database.Options.Ignore.FilterNotForReplication)
|
||||
con.NotForReplication = (bool)reader["is_not_for_replication"];
|
||||
lastid = (int)reader["object_id"];
|
||||
table.Constraints.Add(con);
|
||||
}
|
||||
ConstraintColumn ccon = new ConstraintColumn(con);
|
||||
ccon.Name = reader["ColumnName"].ToString();
|
||||
ccon.ColumnRelationalName = reader["ColumnRelationalName"].ToString();
|
||||
ccon.ColumnRelationalId = (int)reader["ColumnRelationalId"];
|
||||
ccon.Id = (int)reader["ColumnId"];
|
||||
ccon.KeyOrder = con.Columns.Count;
|
||||
ccon.ColumnRelationalDataTypeId = (int)reader["user_type_id"];
|
||||
//table.DependenciesCount++;
|
||||
con.Columns.Add(ccon);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region UniqueKey Functions...
|
||||
private static void FillUniqueKey(Database database, string connectionString)
|
||||
{
|
||||
int lastId = 0;
|
||||
int parentId = 0;
|
||||
bool change = false;
|
||||
ISchemaBase table = null;
|
||||
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(ConstraintSQLCommand.GetUniqueKey(database.Info.Version, database.Info.Edition), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
Constraint con = null;
|
||||
while (reader.Read())
|
||||
{
|
||||
if (parentId != (int)reader["ID"])
|
||||
{
|
||||
parentId = (int)reader["ID"];
|
||||
if (reader["ObjectType"].ToString().Trim().Equals("U"))
|
||||
table = database.Tables.Find(parentId);
|
||||
else
|
||||
table = database.TablesTypes.Find(parentId);
|
||||
change = true;
|
||||
}
|
||||
else
|
||||
change = false;
|
||||
|
||||
if (table != null)
|
||||
{
|
||||
if ((lastId != (int)reader["Index_id"]) || (change))
|
||||
{
|
||||
con = new Constraint(table);
|
||||
con.Name = reader["Name"].ToString();
|
||||
con.Owner = (string)reader["Owner"];
|
||||
con.Id = (int)reader["Index_id"];
|
||||
con.Type = Constraint.ConstraintType.Unique;
|
||||
con.Index.Id = (int)reader["Index_id"];
|
||||
con.Index.AllowPageLocks = (bool)reader["allow_page_locks"];
|
||||
con.Index.AllowRowLocks = (bool)reader["allow_row_locks"];
|
||||
con.Index.FillFactor = (byte)reader["fill_factor"];
|
||||
con.Index.IgnoreDupKey = (bool)reader["ignore_dup_key"];
|
||||
con.Index.IsAutoStatistics = (bool)reader["ignore_dup_key"];
|
||||
con.Index.IsDisabled = (bool)reader["is_disabled"];
|
||||
con.Index.IsPadded = (bool)reader["is_padded"];
|
||||
con.Index.IsPrimaryKey = false;
|
||||
con.Index.IsUniqueKey = true;
|
||||
con.Index.Type = (Index.IndexTypeEnum)(byte)reader["type"];
|
||||
con.Index.Name = con.Name;
|
||||
if (database.Options.Ignore.FilterTableFileGroup)
|
||||
con.Index.FileGroup = reader["FileGroup"].ToString();
|
||||
lastId = (int)reader["Index_id"];
|
||||
if (reader["ObjectType"].ToString().Trim().Equals("U"))
|
||||
((Table)table).Constraints.Add(con);
|
||||
else
|
||||
((TableType)table).Constraints.Add(con);
|
||||
}
|
||||
ConstraintColumn ccon = new ConstraintColumn(con);
|
||||
ccon.Name = reader["ColumnName"].ToString();
|
||||
ccon.IsIncluded = (bool)reader["is_included_column"];
|
||||
ccon.Order = (bool)reader["is_descending_key"];
|
||||
ccon.Id = (int)reader["column_id"];
|
||||
ccon.DataTypeId = (int)reader["user_type_id"];
|
||||
con.Columns.Add(ccon);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region PrimaryKey Functions...
|
||||
private static void FillPrimaryKey(Database database, string connectionString)
|
||||
{
|
||||
int lastId = 0;
|
||||
int parentId = 0;
|
||||
bool change = false;
|
||||
ISchemaBase table = null;
|
||||
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(ConstraintSQLCommand.GetPrimaryKey(database.Info.Version, null), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
Constraint con = null;
|
||||
while (reader.Read())
|
||||
{
|
||||
if (parentId != (int)reader["ID"])
|
||||
{
|
||||
parentId = (int)reader["ID"];
|
||||
if (reader["ObjectType"].ToString().Trim().Equals("U"))
|
||||
table = database.Tables.Find(parentId);
|
||||
else
|
||||
table = database.TablesTypes.Find(parentId);
|
||||
change = true;
|
||||
}
|
||||
else
|
||||
change = false;
|
||||
|
||||
if (table != null)
|
||||
{
|
||||
if ((lastId != (int)reader["Index_id"]) || (change))
|
||||
{
|
||||
con = new Constraint(table);
|
||||
con.Id = (int)reader["Index_id"];
|
||||
con.Name = (string)reader["Name"];
|
||||
con.Owner = (string)reader["Owner"];
|
||||
con.Type = Constraint.ConstraintType.PrimaryKey;
|
||||
con.Index.Id = (int)reader["Index_id"];
|
||||
con.Index.AllowPageLocks = (bool)reader["allow_page_locks"];
|
||||
con.Index.AllowRowLocks = (bool)reader["allow_row_locks"];
|
||||
con.Index.FillFactor = (byte)reader["fill_factor"];
|
||||
con.Index.IgnoreDupKey = (bool)reader["ignore_dup_key"];
|
||||
con.Index.IsAutoStatistics = (bool)reader["ignore_dup_key"];
|
||||
con.Index.IsDisabled = (bool)reader["is_disabled"];
|
||||
con.Index.IsPadded = (bool)reader["is_padded"];
|
||||
con.Index.IsPrimaryKey = true;
|
||||
con.Index.IsUniqueKey = false;
|
||||
con.Index.Type = (Index.IndexTypeEnum)(byte)reader["type"];
|
||||
con.Index.Name = con.Name;
|
||||
if (database.Options.Ignore.FilterTableFileGroup)
|
||||
con.Index.FileGroup = reader["FileGroup"].ToString();
|
||||
lastId = (int)reader["Index_id"];
|
||||
if (reader["ObjectType"].ToString().Trim().Equals("U"))
|
||||
((Table)table).Constraints.Add(con);
|
||||
else
|
||||
((TableType)table).Constraints.Add(con);
|
||||
}
|
||||
ConstraintColumn ccon = new ConstraintColumn(con);
|
||||
ccon.Name = (string)reader["ColumnName"];
|
||||
ccon.IsIncluded = (bool)reader["is_included_column"];
|
||||
ccon.Order = (bool)reader["is_descending_key"];
|
||||
ccon.KeyOrder = (byte)reader["key_ordinal"];
|
||||
ccon.Id = (int)reader["column_id"];
|
||||
ccon.DataTypeId = (int)reader["user_type_id"];
|
||||
con.Columns.Add(ccon);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
public void Fill(Database database, string connectionString)
|
||||
{
|
||||
if (database.Options.Ignore.FilterConstraintPK)
|
||||
FillPrimaryKey(database, connectionString);
|
||||
if (database.Options.Ignore.FilterConstraintFK)
|
||||
FillForeignKey(database, connectionString);
|
||||
if (database.Options.Ignore.FilterConstraintUK)
|
||||
FillUniqueKey(database, connectionString);
|
||||
if (database.Options.Ignore.FilterConstraintCheck)
|
||||
FillCheck(database, connectionString);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateDDLTriggers
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateDDLTriggers(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQL()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetDDLTriggers");
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString)
|
||||
{
|
||||
if (database.Options.Ignore.FilterDDLTriggers)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
conn.Open();
|
||||
using (SqlCommand command = new SqlCommand(GetSQL(), conn))
|
||||
{
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
Trigger trigger = new Trigger(database);
|
||||
trigger.Text = reader["Text"].ToString();
|
||||
trigger.Name = reader["Name"].ToString();
|
||||
trigger.InsteadOf = (bool)reader["is_instead_of_trigger"];
|
||||
trigger.IsDisabled = (bool)reader["is_disabled"];
|
||||
trigger.IsDDLTrigger = true;
|
||||
trigger.NotForReplication = (bool)reader["is_not_for_replication"];
|
||||
trigger.Owner = "";
|
||||
database.DDLTriggers.Add(trigger);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
using System;
|
||||
using System.Data.SqlClient;
|
||||
using System.Globalization;
|
||||
using OpenDBDiff.Schema.Misc;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Options;
|
||||
#if DEBUG
|
||||
using System.Runtime.InteropServices;
|
||||
#endif
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateDatabase
|
||||
{
|
||||
private string connectioString;
|
||||
private SqlOption objectFilter;
|
||||
|
||||
public bool UseDefaultVersionOnVersionParseError { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Constructor de la clase.
|
||||
/// </summary>
|
||||
/// <param name="connectioString">Connection string de la base</param>
|
||||
public GenerateDatabase(string connectioString, SqlOption filter)
|
||||
{
|
||||
this.connectioString = connectioString;
|
||||
this.objectFilter = filter;
|
||||
}
|
||||
|
||||
public DatabaseInfo Get(Database database)
|
||||
{
|
||||
DatabaseInfo item = new DatabaseInfo();
|
||||
using (SqlConnection conn = new SqlConnection(connectioString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(DatabaseSQLCommand.GetVersion(database), conn))
|
||||
{
|
||||
conn.Open();
|
||||
|
||||
item.Server = conn.DataSource;
|
||||
item.Database = conn.Database;
|
||||
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
string versionValue = reader["Version"] as string;
|
||||
try
|
||||
{
|
||||
// used to use the decimal as well when Azure was 10.25
|
||||
var version = new Version(versionValue);
|
||||
item.VersionNumber = float.Parse(String.Format("{0}.{1}", version.Major, version.Minor), CultureInfo.InvariantCulture);
|
||||
|
||||
if (reader.FieldCount > 1 && !reader.IsDBNull(1))
|
||||
{
|
||||
int edition;
|
||||
if (int.TryParse(reader[1].ToString(), out edition)
|
||||
&& Enum.IsDefined(typeof(DatabaseInfo.SQLServerEdition), edition))
|
||||
{
|
||||
item.SetEdition((DatabaseInfo.SQLServerEdition)edition);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception notAGoodIdeaToCatchAllErrors)
|
||||
{
|
||||
var exception = new SchemaException(
|
||||
String.Format("Error parsing ProductVersion. ({0})", versionValue ?? "[null]")
|
||||
, notAGoodIdeaToCatchAllErrors);
|
||||
|
||||
if (!UseDefaultVersionOnVersionParseError)
|
||||
{
|
||||
throw exception;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
using (SqlCommand command = new SqlCommand(DatabaseSQLCommand.Get(item.Version, item.Edition, database), conn))
|
||||
{
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
item.Collation = reader["Collation"].ToString();
|
||||
item.HasFullTextEnabled = ((int)reader["IsFulltextEnabled"]) == 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateDefaults
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateDefaults(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQL()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetDefaults");
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString)
|
||||
{
|
||||
if (database.Options.Ignore.FilterRules)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQL(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
Default item = new Default(database);
|
||||
item.Id = (int)reader["object_id"];
|
||||
item.Name = reader["Name"].ToString();
|
||||
item.Owner = reader["Owner"].ToString();
|
||||
item.Value = reader["Definition"].ToString();
|
||||
database.Defaults.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.Errors;
|
||||
using OpenDBDiff.Schema.Model;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateExtendedProperties
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateExtendedProperties(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQL()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetExtendedProperties");
|
||||
}
|
||||
|
||||
private static string GetTypeDescription(string type)
|
||||
{
|
||||
if (type.Equals("PC")) return "PROCEDURE";
|
||||
if (type.Equals("P")) return "PROCEDURE";
|
||||
if (type.Equals("V")) return "VIEW";
|
||||
if (type.Equals("U")) return "TABLE";
|
||||
if (type.Equals("TR")) return "TRIGGER";
|
||||
if (type.Equals("TA")) return "TRIGGER";
|
||||
if (type.Equals("FS")) return "FUNCTION";
|
||||
if (type.Equals("FN")) return "FUNCTION";
|
||||
if (type.Equals("IF")) return "FUNCTION";
|
||||
if (type.Equals("TF")) return "FUNCTION";
|
||||
return "";
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString, List<MessageLog> messages)
|
||||
{
|
||||
ISQLServerSchemaBase parent;
|
||||
try
|
||||
{
|
||||
if (database.Options.Ignore.FilterExtendedProperties)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQL(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
ExtendedProperty item = new ExtendedProperty(null);
|
||||
if (((byte)reader["Class"]) == 5)
|
||||
{
|
||||
item.Level0type = "ASSEMBLY";
|
||||
item.Level0name = reader["AssemblyName"].ToString();
|
||||
}
|
||||
if (((byte)reader["Class"]) == 1)
|
||||
{
|
||||
string ObjectType = GetTypeDescription(reader["type"].ToString().Trim());
|
||||
item.Level0type = "SCHEMA";
|
||||
item.Level0name = reader["Owner"].ToString();
|
||||
if (!ObjectType.Equals("TRIGGER"))
|
||||
{
|
||||
item.Level1name = reader["ObjectName"].ToString();
|
||||
item.Level1type = ObjectType;
|
||||
}
|
||||
else
|
||||
{
|
||||
item.Level1type = "TABLE";
|
||||
item.Level1name = reader["ParentName"].ToString();
|
||||
item.Level2name = reader["ObjectName"].ToString();
|
||||
item.Level2type = ObjectType;
|
||||
}
|
||||
}
|
||||
if (((byte)reader["Class"]) == 6)
|
||||
{
|
||||
item.Level0type = "SCHEMA";
|
||||
item.Level0name = reader["OwnerType"].ToString();
|
||||
item.Level1name = reader["TypeName"].ToString();
|
||||
item.Level1type = "TYPE";
|
||||
}
|
||||
if (((byte)reader["Class"]) == 7)
|
||||
{
|
||||
item.Level0type = "SCHEMA";
|
||||
item.Level0name = reader["Owner"].ToString();
|
||||
item.Level1type = "TABLE";
|
||||
item.Level1name = reader["ObjectName"].ToString();
|
||||
item.Level2type = reader["class_desc"].ToString();
|
||||
item.Level2name = reader["IndexName"].ToString();
|
||||
}
|
||||
item.Value = reader["Value"].ToString();
|
||||
item.Name = reader["Name"].ToString();
|
||||
parent = ((ISQLServerSchemaBase)database.Find(item.FullName));
|
||||
if (parent != null)
|
||||
{
|
||||
item.Parent = (ISchemaBase)parent;
|
||||
parent.ExtendedProperties.Add(item);
|
||||
}
|
||||
else
|
||||
messages.Add(new MessageLog(item.FullName + " not found in extended properties.", "", MessageLog.LogType.Error));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
messages.Add(new MessageLog(ex.Message, ex.StackTrace, MessageLog.LogType.Error));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateFileGroups
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateFileGroups(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQLFile(FileGroup filegroup)
|
||||
{
|
||||
string query = SQLQueries.SQLQueryFactory.Get("GetDatabaseFile");
|
||||
|
||||
return query.Replace("{ID}", filegroup.Id.ToString());
|
||||
}
|
||||
|
||||
private static string GetSQL()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetFileGroups");
|
||||
}
|
||||
|
||||
private static void FillFiles(FileGroup filegroup, string connectionString)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQLFile(filegroup), conn))
|
||||
{
|
||||
conn.Open();
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
FileGroupFile item = new FileGroupFile(filegroup);
|
||||
item.Id = (int)reader["file_id"];
|
||||
item.Name = reader["name"].ToString();
|
||||
item.Owner = "";
|
||||
item.Growth = (int)reader["growth"];
|
||||
item.IsPercentGrowth = (bool)reader["is_percent_growth"];
|
||||
item.IsSparse = (bool)reader["is_sparse"];
|
||||
item.MaxSize = (int)reader["max_size"];
|
||||
item.PhysicalName = reader["physical_name"].ToString();
|
||||
item.Size = (int)reader["size"];
|
||||
item.Type = (byte)reader["type"];
|
||||
filegroup.Files.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (database.Options.Ignore.FilterTableFileGroup)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQL(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
FileGroup item = new FileGroup(database);
|
||||
item.Id = (int)reader["ID"];
|
||||
item.Name = reader["name"].ToString();
|
||||
item.Owner = "";
|
||||
item.IsDefaultFileGroup = (bool)reader["is_default"];
|
||||
item.IsReadOnly = (bool)reader["is_read_only"];
|
||||
item.IsFileStream = reader["type"].Equals("FD");
|
||||
FillFiles(item, connectionString);
|
||||
database.FileGroups.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateFullText
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateFullText(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQL()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetFullTextCatalogs");
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString)
|
||||
{
|
||||
if (database.Options.Ignore.FilterFullText)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQL(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
FullText item = new FullText(database);
|
||||
item.Id = (int)reader["fulltext_catalog_id"];
|
||||
item.Name = reader["Name"].ToString();
|
||||
item.Owner = reader["Owner"].ToString();
|
||||
item.IsAccentSensity = (bool)reader["is_accent_sensitivity_on"];
|
||||
item.IsDefault = (bool)reader["is_default"];
|
||||
if (!reader.IsDBNull(reader.GetOrdinal("path")))
|
||||
item.Path = reader["path"].ToString().Substring(0, reader["path"].ToString().Length - item.Name.Length);
|
||||
if (!reader.IsDBNull(reader.GetOrdinal("FileGroupName")))
|
||||
item.FileGroupName = reader["FileGroupName"].ToString();
|
||||
database.FullText.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.Events;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateFullTextIndex
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateFullTextIndex(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString)
|
||||
{
|
||||
//not supported in azure yet
|
||||
if (database.Info.Version == DatabaseInfo.SQLServerVersion.SQLServerAzure10) return;
|
||||
|
||||
int parentId = 0;
|
||||
bool change = false;
|
||||
Table parent = null;
|
||||
root.RaiseOnReading(new ProgressEventArgs("Reading FullText Index...", Constants.READING_INDEXES));
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(FullTextIndexSQLCommand.Get(database.Info.Version), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
FullTextIndex item = null;
|
||||
while (reader.Read())
|
||||
{
|
||||
root.RaiseOnReadingOne(reader["Name"]);
|
||||
if (parentId != (int)reader["object_id"])
|
||||
{
|
||||
parentId = (int)reader["object_id"];
|
||||
parent = database.Tables.Find(parentId);
|
||||
change = true;
|
||||
}
|
||||
else
|
||||
change = false;
|
||||
if (change)
|
||||
{
|
||||
item = new FullTextIndex(parent);
|
||||
item.Name = reader["Name"].ToString();
|
||||
item.Owner = parent.Owner;
|
||||
item.FullText = reader["FullTextCatalogName"].ToString();
|
||||
item.Index = reader["IndexName"].ToString();
|
||||
item.IsDisabled = !(bool)reader["is_enabled"];
|
||||
item.ChangeTrackingState = reader["ChangeTracking"].ToString();
|
||||
if (database.Info.Version == DatabaseInfo.SQLServerVersion.SQLServer2008)
|
||||
item.FileGroup = reader["FileGroupName"].ToString();
|
||||
((Table)parent).FullTextIndex.Add(item);
|
||||
}
|
||||
FullTextIndexColumn ccon = new FullTextIndexColumn();
|
||||
ccon.ColumnName = reader["ColumnName"].ToString();
|
||||
ccon.Language = reader["LanguageName"].ToString();
|
||||
item.Columns.Add(ccon);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
using OpenDBDiff.Schema.Events;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
using System;
|
||||
using System.Data.SqlClient;
|
||||
using System.Linq;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateFunctions
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateFunctions(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQLParameters()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetParameters");
|
||||
}
|
||||
|
||||
private static void FillParameters(Database database, string connectionString)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQLParameters(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
var objectName = reader["ObjectName"].ToString();
|
||||
|
||||
if (database.CLRFunctions.Contains(objectName))
|
||||
{
|
||||
Parameter param = new Parameter();
|
||||
param.Name = reader["Name"].ToString();
|
||||
param.Type = reader["TypeName"].ToString();
|
||||
param.Size = (short)reader["max_length"];
|
||||
param.Scale = (byte)reader["scale"];
|
||||
param.Precision = (byte)reader["precision"];
|
||||
param.Output = (bool)reader["is_output"];
|
||||
if (param.Type.Equals("nchar") || param.Type.Equals("nvarchar"))
|
||||
{
|
||||
if (param.Size != -1)
|
||||
param.Size = param.Size / 2;
|
||||
}
|
||||
database.CLRFunctions[objectName].Parameters.Add(param);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString)
|
||||
{
|
||||
int lastViewId = 0;
|
||||
if ((database.Options.Ignore.FilterFunction) || (database.Options.Ignore.FilterCLRFunction))
|
||||
{
|
||||
root.RaiseOnReading(new ProgressEventArgs("Reading functions...", Constants.READING_FUNCTIONS));
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(FunctionSQLCommand.Get(database.Info.Version, database.Info.Edition), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
Function itemF = null;
|
||||
CLRFunction itemC = null;
|
||||
while (reader.Read())
|
||||
{
|
||||
root.RaiseOnReadingOne(reader["name"]);
|
||||
if ((!reader["type"].ToString().Trim().Equals("FS")) && (database.Options.Ignore.FilterFunction))
|
||||
{
|
||||
if (lastViewId != (int)reader["object_id"])
|
||||
{
|
||||
itemF = new Function(database);
|
||||
itemF.Id = (int)reader["object_id"];
|
||||
itemF.Name = reader["name"].ToString();
|
||||
itemF.Owner = reader["owner"].ToString();
|
||||
itemF.IsSchemaBinding = reader["IsSchemaBound"].ToString().Equals("1");
|
||||
database.Functions.Add(itemF);
|
||||
lastViewId = itemF.Id;
|
||||
}
|
||||
if (itemF.IsSchemaBinding)
|
||||
{
|
||||
if (!reader.IsDBNull(reader.GetOrdinal("referenced_major_id")))
|
||||
database.Dependencies.Add(database, (int)reader["referenced_major_id"], itemF);
|
||||
if (!String.IsNullOrEmpty(reader["TableName"].ToString()))
|
||||
itemF.DependenciesIn.Add(reader["TableName"].ToString());
|
||||
if (!String.IsNullOrEmpty(reader["DependOut"].ToString()))
|
||||
itemF.DependenciesOut.Add(reader["DependOut"].ToString());
|
||||
}
|
||||
}
|
||||
if ((reader["type"].ToString().Trim().Equals("FS")) && (database.Options.Ignore.FilterCLRFunction))
|
||||
{
|
||||
itemC = new CLRFunction(database);
|
||||
if (lastViewId != (int)reader["object_id"])
|
||||
{
|
||||
itemC.Id = (int)reader["object_id"];
|
||||
itemC.Name = reader["name"].ToString();
|
||||
itemC.Owner = reader["owner"].ToString();
|
||||
itemC.IsAssembly = true;
|
||||
itemC.AssemblyId = (int)reader["assembly_id"];
|
||||
itemC.AssemblyName = reader["assembly_name"].ToString();
|
||||
itemC.AssemblyClass = reader["assembly_class"].ToString();
|
||||
itemC.AssemblyExecuteAs = reader["ExecuteAs"].ToString();
|
||||
itemC.AssemblyMethod = reader["assembly_method"].ToString();
|
||||
itemC.ReturnType.Type = reader["ReturnType"].ToString();
|
||||
itemC.ReturnType.Size = (short)reader["max_length"];
|
||||
itemC.ReturnType.Scale = (byte)reader["Scale"];
|
||||
itemC.ReturnType.Precision = (byte)reader["precision"];
|
||||
if (itemC.ReturnType.Type.Equals("nchar") || itemC.ReturnType.Type.Equals("nvarchar"))
|
||||
{
|
||||
if (itemC.ReturnType.Size != -1)
|
||||
itemC.ReturnType.Size = itemC.ReturnType.Size / 2;
|
||||
}
|
||||
database.CLRFunctions.Add(itemC);
|
||||
lastViewId = itemC.Id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (database.CLRFunctions.Any())
|
||||
FillParameters(database, connectionString);
|
||||
}
|
||||
}
|
||||
}
|
||||
105
OpenDBDiff.Schema.SQLServer.Generates/Generates/GenerateIndex.cs
Normal file
105
OpenDBDiff.Schema.SQLServer.Generates/Generates/GenerateIndex.cs
Normal file
@@ -0,0 +1,105 @@
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.Events;
|
||||
using OpenDBDiff.Schema.Model;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateIndex
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateIndex(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString)
|
||||
{
|
||||
int indexid = 0;
|
||||
int parentId = 0;
|
||||
bool change = false;
|
||||
string type;
|
||||
ISchemaBase parent = null;
|
||||
root.RaiseOnReading(new ProgressEventArgs("Reading Index...", Constants.READING_INDEXES));
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(IndexSQLCommand.Get(database.Info.Version, database.Info.Edition), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
Index item = null;
|
||||
while (reader.Read())
|
||||
{
|
||||
root.RaiseOnReadingOne(reader["Name"]);
|
||||
type = reader["ObjectType"].ToString().Trim();
|
||||
if (parentId != (int)reader["object_id"])
|
||||
{
|
||||
parentId = (int)reader["object_id"];
|
||||
if (type.Equals("V"))
|
||||
parent = database.Views.Find(parentId);
|
||||
else
|
||||
parent = database.Tables.Find(parentId);
|
||||
change = true;
|
||||
}
|
||||
else
|
||||
change = false;
|
||||
|
||||
if (parent != null)
|
||||
{
|
||||
if (indexid != (int)reader["index_id"] || change)
|
||||
{
|
||||
item = new Index(parent);
|
||||
item.Name = reader["Name"].ToString();
|
||||
item.Owner = parent.Owner;
|
||||
item.Type = (Index.IndexTypeEnum)(byte)reader["type"];
|
||||
item.Id = (int)reader["index_id"];
|
||||
item.IgnoreDupKey = (bool)reader["ignore_dup_key"];
|
||||
item.IsAutoStatistics = (bool)reader["NoAutomaticRecomputation"];
|
||||
item.IsDisabled = (bool)reader["is_disabled"];
|
||||
item.IsPrimaryKey = (bool)reader["is_primary_key"];
|
||||
item.IsUniqueKey = (bool)reader["is_unique"];
|
||||
if (database.Options.Ignore.FilterIndexRowLock)
|
||||
{
|
||||
item.AllowPageLocks = (bool)reader["allow_page_locks"];
|
||||
item.AllowRowLocks = (bool)reader["allow_row_locks"];
|
||||
}
|
||||
if (database.Options.Ignore.FilterIndexFillFactor)
|
||||
{
|
||||
item.FillFactor = (byte)reader["fill_factor"];
|
||||
item.IsPadded = (bool)reader["is_padded"];
|
||||
}
|
||||
if ((database.Options.Ignore.FilterTableFileGroup) && (item.Type != Index.IndexTypeEnum.XML))
|
||||
item.FileGroup = reader["FileGroup"].ToString();
|
||||
|
||||
if ((database.Info.Version == DatabaseInfo.SQLServerVersion.SQLServer2008) && (database.Options.Ignore.FilterIndexFilter))
|
||||
{
|
||||
item.FilterDefintion = reader["FilterDefinition"].ToString();
|
||||
}
|
||||
indexid = (int)reader["index_id"];
|
||||
if (type.Equals("V"))
|
||||
((View)parent).Indexes.Add(item);
|
||||
else
|
||||
((Table)parent).Indexes.Add(item);
|
||||
}
|
||||
IndexColumn ccon = new IndexColumn(item.Parent);
|
||||
ccon.Name = reader["ColumnName"].ToString();
|
||||
ccon.IsIncluded = (bool)reader["is_included_column"];
|
||||
ccon.Order = (bool)reader["is_descending_key"];
|
||||
ccon.Id = (int)reader["column_id"];
|
||||
ccon.KeyOrder = (byte)reader["key_ordinal"];
|
||||
ccon.DataTypeId = (int)reader["user_type_id"];
|
||||
if ((!ccon.IsIncluded) || (ccon.IsIncluded && database.Options.Ignore.FilterIndexIncludeColumns))
|
||||
item.Columns.Add(ccon);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
using System;
|
||||
using System.Data.SqlClient;
|
||||
using System.Text;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GeneratePartitionFunctions
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GeneratePartitionFunctions(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQL()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetPartitionFunctions");
|
||||
}
|
||||
|
||||
private static string ToHex(byte[] stream)
|
||||
{
|
||||
StringBuilder sHex = new StringBuilder(2 * stream.Length);
|
||||
for (int i = 0; i < stream.Length; i++)
|
||||
sHex.AppendFormat("{0:X2} ", stream[i]);
|
||||
return "0x" + sHex.ToString().Replace(" ", String.Empty);
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectioString)
|
||||
{
|
||||
int lastObjectId = 0;
|
||||
PartitionFunction item = null;
|
||||
if (database.Options.Ignore.FilterPartitionFunction)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectioString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQL(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
if (lastObjectId != (int)reader["function_id"])
|
||||
{
|
||||
lastObjectId = (int)reader["function_id"];
|
||||
item = new PartitionFunction(database);
|
||||
item.Id = (int)reader["function_id"];
|
||||
item.Name = reader["name"].ToString();
|
||||
item.IsBoundaryRight = (bool)reader["IsRight"];
|
||||
item.Precision = (byte)reader["precision"];
|
||||
item.Scale = (byte)reader["scale"];
|
||||
item.Size = (short)reader["max_length"];
|
||||
item.Type = reader["TypeName"].ToString();
|
||||
database.PartitionFunctions.Add(item);
|
||||
}
|
||||
|
||||
switch (item.Type) {
|
||||
case "binary":
|
||||
case "varbinary":
|
||||
item.Values.Add(ToHex((byte[])reader["value"]));
|
||||
break;
|
||||
case "date":
|
||||
item.Values.Add(String.Format("'{0:yyyy/MM/dd}'", (DateTime)reader["value"]));
|
||||
break;
|
||||
case "smalldatetime":
|
||||
case "datetime":
|
||||
item.Values.Add(String.Format("'{0:yyyy/MM/dd HH:mm:ss.fff}'", (DateTime)reader["value"]));
|
||||
break;
|
||||
default:
|
||||
item.Values.Add(reader["value"].ToString());
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GeneratePartitionScheme
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GeneratePartitionScheme(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQL()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetPartitionSchemes");
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectioString)
|
||||
{
|
||||
int lastObjectId = 0;
|
||||
PartitionScheme item = null;
|
||||
if (database.Options.Ignore.FilterPartitionScheme)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectioString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQL(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
if (lastObjectId != (int)reader["ID"])
|
||||
{
|
||||
lastObjectId = (int)reader["ID"];
|
||||
item = new PartitionScheme(database);
|
||||
item.Id = (int)reader["ID"];
|
||||
item.Name = reader["name"].ToString();
|
||||
item.PartitionFunction = reader["FunctionName"].ToString();
|
||||
database.PartitionSchemes.Add(item);
|
||||
}
|
||||
item.FileGroups.Add(reader["FileGroupName"].ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateRules
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateRules(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQL()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetRules");
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString)
|
||||
{
|
||||
if (database.Options.Ignore.FilterRules)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQL(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
Rule item = new Rule(database);
|
||||
item.Id = (int)reader["object_id"];
|
||||
item.Name = reader["Name"].ToString();
|
||||
item.Owner = reader["Owner"].ToString();
|
||||
item.Text = reader["Definition"].ToString();
|
||||
database.Rules.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateSchemas
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateSchemas(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQL()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetSchemas");
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectioString)
|
||||
{
|
||||
if (database.Options.Ignore.FilterSchema)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectioString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQL(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
Model.Schema item = new Model.Schema(database);
|
||||
item.Id = (int)reader["schema_id"];
|
||||
item.Name = reader["name"].ToString();
|
||||
item.Owner = reader["owner"].ToString();
|
||||
database.Schemas.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
using OpenDBDiff.Schema.Events;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
using System.Data.SqlClient;
|
||||
using System.Linq;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateStoredProcedures
|
||||
{
|
||||
private static int NameIndex = -1;
|
||||
private static int object_idIndex = -1;
|
||||
private static int ownerIndex = -1;
|
||||
private static int typeIndex = -1;
|
||||
|
||||
private Generate root;
|
||||
|
||||
public GenerateStoredProcedures(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static void InitIndex(SqlDataReader reader)
|
||||
{
|
||||
if (NameIndex == -1)
|
||||
{
|
||||
object_idIndex = reader.GetOrdinal("object_id");
|
||||
NameIndex = reader.GetOrdinal("Name");
|
||||
ownerIndex = reader.GetOrdinal("owner");
|
||||
typeIndex = reader.GetOrdinal("type");
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetSQLParameters()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetParameters");
|
||||
}
|
||||
|
||||
private static string GetSQL(DatabaseInfo.SQLServerVersion version)
|
||||
{
|
||||
if (version == DatabaseInfo.SQLServerVersion.SQLServerAzure10)
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetProcedures", DatabaseInfo.SQLServerVersion.SQLServerAzure10);
|
||||
}
|
||||
else
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetProcedures");
|
||||
}
|
||||
}
|
||||
|
||||
private static void FillParameters(Database database, string connectionString)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQLParameters(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
var objectName = reader["ObjectName"].ToString();
|
||||
|
||||
if (database.CLRProcedures.Contains(objectName))
|
||||
{
|
||||
Parameter param = new Parameter();
|
||||
param.Name = reader["Name"].ToString();
|
||||
param.Type = reader["TypeName"].ToString();
|
||||
param.Size = (short)reader["max_length"];
|
||||
param.Scale = (byte)reader["scale"];
|
||||
param.Precision = (byte)reader["precision"];
|
||||
param.Output = (bool)reader["is_output"];
|
||||
if (param.Type.Equals("nchar") || param.Type.Equals("nvarchar"))
|
||||
{
|
||||
if (param.Size != -1)
|
||||
param.Size = param.Size / 2;
|
||||
}
|
||||
database.CLRProcedures[objectName].Parameters.Add(param);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString)
|
||||
{
|
||||
if ((database.Options.Ignore.FilterStoredProcedure) || (database.Options.Ignore.FilterCLRStoredProcedure))
|
||||
{
|
||||
root.RaiseOnReading(new ProgressEventArgs("Reading stored procedures...", Constants.READING_PROCEDURES));
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQL(database.Info.Version), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
InitIndex(reader);
|
||||
root.RaiseOnReadingOne(reader[NameIndex]);
|
||||
|
||||
var objectType = reader[typeIndex].ToString().Trim();
|
||||
switch (objectType)
|
||||
{
|
||||
case "P":
|
||||
if (database.Options.Ignore.FilterStoredProcedure)
|
||||
{
|
||||
StoredProcedure item = new StoredProcedure(database);
|
||||
item.Id = (int)reader[object_idIndex];
|
||||
item.Name = (string)reader[NameIndex];
|
||||
item.Owner = (string)reader[ownerIndex];
|
||||
database.Procedures.Add(item);
|
||||
}
|
||||
break;
|
||||
|
||||
case "PC":
|
||||
if (database.Options.Ignore.FilterCLRStoredProcedure)
|
||||
{
|
||||
CLRStoredProcedure item = new CLRStoredProcedure(database);
|
||||
item.Id = (int)reader[object_idIndex];
|
||||
item.Name = reader[NameIndex].ToString();
|
||||
item.Owner = reader[ownerIndex].ToString();
|
||||
item.IsAssembly = true;
|
||||
item.AssemblyId = (int)reader["assembly_id"];
|
||||
item.AssemblyName = reader["assembly_name"].ToString();
|
||||
item.AssemblyClass = reader["assembly_class"].ToString();
|
||||
item.AssemblyExecuteAs = reader["ExecuteAs"].ToString();
|
||||
item.AssemblyMethod = reader["assembly_method"].ToString();
|
||||
database.CLRProcedures.Add(item);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (database.CLRProcedures.Any())
|
||||
FillParameters(database, connectionString);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateSynonyms
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateSynonyms(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQL()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetSynonyms");
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString)
|
||||
{
|
||||
if (database.Options.Ignore.FilterSynonyms)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQL(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
Synonym item = new Synonym(database);
|
||||
item.Id = (int)reader["object_id"];
|
||||
item.Name = reader["Name"].ToString();
|
||||
item.Owner = reader["Owner"].ToString();
|
||||
item.Value = reader["base_object_name"].ToString();
|
||||
database.Synonyms.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,313 @@
|
||||
using OpenDBDiff.Schema.Errors;
|
||||
using OpenDBDiff.Schema.Events;
|
||||
using OpenDBDiff.Schema.Model;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.SqlClient;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using Constraint = OpenDBDiff.Schema.SQLServer.Generates.Model.Constraint;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateTables
|
||||
{
|
||||
private int colIDIndex = -1;
|
||||
private int colNameIndex = -1;
|
||||
private int colFormulaIndex = -1;
|
||||
private int colIsPersistedIndex = -1;
|
||||
private int colIsComputedIndex = -1;
|
||||
private int colNullableIndex = -1;
|
||||
private int colXmlSchemaIndex = -1;
|
||||
private int colIs_xml_documentIndex = -1;
|
||||
private int colPrecisionIndex = -1;
|
||||
private int colScaleIndex = -1;
|
||||
private int colDataUserTypeIdIndex = -1;
|
||||
private int colIsUserDefinedTypeIndex = -1;
|
||||
private int colSizeIndex = -1;
|
||||
private int colHasIndexIndex = -1;
|
||||
private int colHasComputedFormulaIndex = -1;
|
||||
private int colIsRowGuidIndex = -1;
|
||||
private int colTypeIndex = -1;
|
||||
private int colOwnerType = -1;
|
||||
private int colis_sparseIndex = -1;
|
||||
private int colIs_FileStream = -1;
|
||||
private int colDefaultIdIndex = -1;
|
||||
private int colDefaultNameIndex = -1;
|
||||
private int colDefaultDefinitionIndex = -1;
|
||||
private int colrule_object_idIndex = -1;
|
||||
private int colIsIdentityReplIndex = -1;
|
||||
private int colCollationIndex = -1;
|
||||
private int colIsIdentityIndex = -1;
|
||||
private int colIdentSeedIndex = -1;
|
||||
private int colIdentIncrementIndex = -1;
|
||||
private int TableIdIndex = -1;
|
||||
private int TableNameIndex = -1;
|
||||
private int TableOwnerIndex = -1;
|
||||
private int TableHasChangeTracking = -1;
|
||||
private int TableHasChangeTrackingTrackColumn = -1;
|
||||
private int TableLockEscalation = -1;
|
||||
private int Text_In_Row_limitIndex = -1;
|
||||
private int HasClusteredIndexIndex = -1;
|
||||
private int large_value_types_out_of_rowIndex = -1;
|
||||
private int HasVarDecimalIndex = -1;
|
||||
private int FileGroupIndex = -1;
|
||||
private int FileGroupTextIndex = -1;
|
||||
private int FileGroupStreamIndex = -1;
|
||||
|
||||
private Generate root;
|
||||
|
||||
public GenerateTables(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private void InitTableIndex(Database database, IDataRecord reader)
|
||||
{
|
||||
if (reader == null) throw new ArgumentNullException("reader");
|
||||
if (TableIdIndex == -1)
|
||||
{
|
||||
TableIdIndex = reader.GetOrdinal("TableId");
|
||||
TableNameIndex = reader.GetOrdinal("TableName");
|
||||
TableOwnerIndex = reader.GetOrdinal("TableOwner");
|
||||
Text_In_Row_limitIndex = reader.GetOrdinal("Text_In_Row_limit");
|
||||
HasClusteredIndexIndex = reader.GetOrdinal("HasClusteredIndex");
|
||||
large_value_types_out_of_rowIndex = reader.GetOrdinal("large_value_types_out_of_row");
|
||||
HasVarDecimalIndex = reader.GetOrdinal("HasVarDecimal");
|
||||
FileGroupIndex = reader.GetOrdinal("FileGroup");
|
||||
FileGroupTextIndex = reader.GetOrdinal("FileGroupText");
|
||||
if (database.Info.Version == DatabaseInfo.SQLServerVersion.SQLServer2008)
|
||||
{
|
||||
FileGroupStreamIndex = reader.GetOrdinal("FileGroupStream");
|
||||
TableHasChangeTracking = reader.GetOrdinal("HasChangeTracking");
|
||||
TableHasChangeTrackingTrackColumn = reader.GetOrdinal("HasChangeTrackingTrackColumn");
|
||||
TableLockEscalation = reader.GetOrdinal("lock_escalation_desc");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void InitColIndex(Database database, IDataRecord reader)
|
||||
{
|
||||
if (reader == null) throw new ArgumentNullException("reader");
|
||||
if (colNameIndex == -1)
|
||||
{
|
||||
colIDIndex = reader.GetOrdinal("ID");
|
||||
colNameIndex = reader.GetOrdinal("Name");
|
||||
colFormulaIndex = reader.GetOrdinal("Formula");
|
||||
colIsPersistedIndex = reader.GetOrdinal("FormulaPersisted");
|
||||
colIsComputedIndex = reader.GetOrdinal("IsComputed");
|
||||
colNullableIndex = reader.GetOrdinal("IsNullable");
|
||||
colOwnerType = reader.GetOrdinal("OwnerType");
|
||||
colXmlSchemaIndex = reader.GetOrdinal("XmlSchema");
|
||||
colIs_xml_documentIndex = reader.GetOrdinal("Is_xml_document");
|
||||
colPrecisionIndex = reader.GetOrdinal("Precision");
|
||||
colScaleIndex = reader.GetOrdinal("Scale");
|
||||
colDataUserTypeIdIndex = reader.GetOrdinal("user_type_id");
|
||||
colIsUserDefinedTypeIndex = reader.GetOrdinal("is_user_defined");
|
||||
colSizeIndex = reader.GetOrdinal("Size");
|
||||
colHasIndexIndex = reader.GetOrdinal("HasIndex");
|
||||
colHasComputedFormulaIndex = reader.GetOrdinal("HasComputedFormula");
|
||||
colIsRowGuidIndex = reader.GetOrdinal("IsRowGuid");
|
||||
colTypeIndex = reader.GetOrdinal("Type");
|
||||
colDefaultIdIndex = reader.GetOrdinal("DefaultId");
|
||||
colDefaultNameIndex = reader.GetOrdinal("DefaultName");
|
||||
colDefaultDefinitionIndex = reader.GetOrdinal("DefaultDefinition");
|
||||
colrule_object_idIndex = reader.GetOrdinal("rule_object_id");
|
||||
colIsIdentityReplIndex = reader.GetOrdinal("IsIdentityRepl");
|
||||
colCollationIndex = reader.GetOrdinal("Collation");
|
||||
colIsIdentityIndex = reader.GetOrdinal("IsIdentity");
|
||||
colIdentSeedIndex = reader.GetOrdinal("IdentSeed");
|
||||
colIdentIncrementIndex = reader.GetOrdinal("IdentIncrement");
|
||||
if (database.Info.Version == DatabaseInfo.SQLServerVersion.SQLServer2008)
|
||||
{
|
||||
colis_sparseIndex = reader.GetOrdinal("is_sparse");
|
||||
colIs_FileStream = reader.GetOrdinal("is_filestream");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void FillColumn<T>(ITable<T> table, SqlDataReader reader) where T : ISchemaBase
|
||||
{
|
||||
Database database = (Database)table.Parent;
|
||||
|
||||
InitColIndex(database, reader);
|
||||
Column col = new Column((ISchemaBase)table);
|
||||
col.Id = (int)reader[colIDIndex];
|
||||
if (database.Options.Ignore.FilterColumnOrder)
|
||||
col.Position = table.Columns.Count + 1;
|
||||
|
||||
if (database.Options.Ignore.FilterColumnCollation)
|
||||
col.Collation = (string)reader[colCollationIndex];
|
||||
|
||||
if (database.Options.Ignore.FilterColumnIdentity)
|
||||
{
|
||||
col.IsIdentity = (bool)reader[colIsIdentityIndex];
|
||||
if ((col.IsIdentity) || (col.IsIdentityForReplication))
|
||||
{
|
||||
if (!reader.IsDBNull(colIdentSeedIndex))
|
||||
col.IdentitySeed = (long)(decimal)reader[colIdentSeedIndex];
|
||||
else
|
||||
col.IdentitySeed = 1;
|
||||
|
||||
if (!reader.IsDBNull(colIdentIncrementIndex))
|
||||
col.IdentityIncrement = (int)(decimal)reader[colIdentIncrementIndex];
|
||||
else
|
||||
col.IdentityIncrement = 1;
|
||||
}
|
||||
if (database.Options.Ignore.FilterNotForReplication)
|
||||
col.IsIdentityForReplication = ((int)reader[colIsIdentityReplIndex] == 1);
|
||||
}
|
||||
col.Name = (string)reader[colNameIndex];
|
||||
col.Owner = table.Owner;
|
||||
col.ComputedFormula = (string)reader[colFormulaIndex];
|
||||
col.IsPersisted = (bool)reader[colIsPersistedIndex];
|
||||
col.IsComputed = (bool)reader[colIsComputedIndex];
|
||||
col.IsNullable = (bool)reader[colNullableIndex];
|
||||
col.XmlSchema = reader[colXmlSchemaIndex].ToString();
|
||||
col.IsXmlDocument = (bool)reader[colIs_xml_documentIndex];
|
||||
col.Precision = (byte)reader[colPrecisionIndex];
|
||||
col.Scale = (byte)reader[colScaleIndex];
|
||||
col.DataUserTypeId = (int)reader[colDataUserTypeIdIndex];
|
||||
col.IsUserDefinedType = (bool)reader[colIsUserDefinedTypeIndex];
|
||||
if (!String.IsNullOrEmpty(reader[colSizeIndex].ToString()))
|
||||
col.Size = (short)reader[colSizeIndex];
|
||||
col.HasIndexDependencies = ((int)reader[colHasIndexIndex] == 1);
|
||||
col.HasComputedDependencies = ((int)reader[colHasComputedFormulaIndex] == 1);
|
||||
col.IsRowGuid = (bool)reader[colIsRowGuidIndex];
|
||||
if (col.IsUserDefinedType)
|
||||
col.Type = "[" + (string)reader[colOwnerType] + "].[" + (string)reader[colTypeIndex] + "]";
|
||||
else
|
||||
col.Type = (string)reader[colTypeIndex];
|
||||
if (((Database)table.Parent).Info.Version == DatabaseInfo.SQLServerVersion.SQLServer2008)
|
||||
{
|
||||
col.IsSparse = (bool)reader[colis_sparseIndex];
|
||||
col.IsFileStream = (bool)reader[colIs_FileStream];
|
||||
}
|
||||
if ((int)reader[colDefaultIdIndex] != 0)
|
||||
{
|
||||
col.DefaultConstraint = new ColumnConstraint(col)
|
||||
{
|
||||
Id = (int)reader[colDefaultIdIndex],
|
||||
Owner = table.Owner,
|
||||
Name = (string)reader[colDefaultNameIndex],
|
||||
Type = Constraint.ConstraintType.Default,
|
||||
Definition = (string)reader[colDefaultDefinitionIndex]
|
||||
};
|
||||
}
|
||||
if ((int)reader[colrule_object_idIndex] != 0)
|
||||
col.Rule = ((Database)table.Parent).Rules.Find((int)reader[colrule_object_idIndex]);
|
||||
table.Columns.Add(col);
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString, List<MessageLog> messages)
|
||||
{
|
||||
try
|
||||
{
|
||||
root.RaiseOnReading(new ProgressEventArgs("Reading tables...", Constants.READING_TABLES));
|
||||
FillTables(database, connectionString);
|
||||
if (database.Tables.Any() || database.TablesTypes.Any())
|
||||
{
|
||||
if (database.Options.Ignore.FilterConstraint)
|
||||
(new GenerateConstraint(root)).Fill(database, connectionString);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
messages.Add(new MessageLog(ex.Message, ex.StackTrace, MessageLog.LogType.Error));
|
||||
}
|
||||
}
|
||||
|
||||
private void FillTables(Database database, string connectionString)
|
||||
{
|
||||
int textInRow;
|
||||
Boolean largeValues;
|
||||
Boolean varDecimal;
|
||||
int lastObjectId = 0;
|
||||
bool isTable = true;
|
||||
ISchemaBase item = null;
|
||||
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(TableSQLCommand.GetTableDetail(database.Info.Version, database.Info.Edition), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
InitTableIndex(database, reader);
|
||||
root.RaiseOnReadingOne(reader[TableNameIndex]);
|
||||
if (lastObjectId != (int)reader[TableIdIndex])
|
||||
{
|
||||
lastObjectId = (int)reader[TableIdIndex];
|
||||
isTable = reader["ObjectType"].ToString().Trim().Equals("U");
|
||||
if (isTable)
|
||||
{
|
||||
item = new Table(database);
|
||||
item.Id = (int)reader[TableIdIndex];
|
||||
item.Name = (string)reader[TableNameIndex];
|
||||
item.Owner = (string)reader[TableOwnerIndex];
|
||||
((Table)item).HasClusteredIndex = (int)reader[HasClusteredIndexIndex] == 1;
|
||||
textInRow = (int)reader[Text_In_Row_limitIndex];
|
||||
largeValues = (Boolean)reader[large_value_types_out_of_rowIndex];
|
||||
varDecimal = ((int)reader[HasVarDecimalIndex]) == 1;
|
||||
if (database.Options.Ignore.FilterTableFileGroup)
|
||||
{
|
||||
((Table)item).FileGroup = (string)reader[FileGroupIndex];
|
||||
((Table)item).FileGroupText = (string)reader[FileGroupTextIndex];
|
||||
if (database.Info.Version == DatabaseInfo.SQLServerVersion.SQLServer2008)
|
||||
{
|
||||
if (database.Options.Ignore.FilterTableChangeTracking)
|
||||
{
|
||||
((Table)item).FileGroupStream = (string)reader[FileGroupStreamIndex];
|
||||
((Table)item).HasChangeTracking = ((int)reader[TableHasChangeTracking]) == 1;
|
||||
((Table)item).HasChangeTrackingTrackColumn = ((int)reader[TableHasChangeTrackingTrackColumn]) == 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (database.Options.Ignore.FilterTableOption)
|
||||
{
|
||||
if (textInRow > 0) ((Table)item).Options.Add(new TableOption("TextInRow", textInRow.ToString(CultureInfo.InvariantCulture), item));
|
||||
if (largeValues) ((Table)item).Options.Add(new TableOption("LargeValues", "1", item));
|
||||
if (varDecimal) ((Table)item).Options.Add(new TableOption("VarDecimal", "1", item));
|
||||
}
|
||||
if ((database.Options.Ignore.FilterTableLockEscalation) && (database.Info.Version == DatabaseInfo.SQLServerVersion.SQLServer2008))
|
||||
((Table)item).Options.Add(new TableOption("LockEscalation", (string)reader[TableLockEscalation], item));
|
||||
else
|
||||
((Table)item).Options.Add(new TableOption("LockEscalation", "TABLE", item));
|
||||
database.Tables.Add((Table)item);
|
||||
}
|
||||
else
|
||||
{
|
||||
item = new TableType(database)
|
||||
{
|
||||
Id = (int)reader[TableIdIndex],
|
||||
Name = (string)reader[TableNameIndex],
|
||||
Owner = (string)reader[TableOwnerIndex]
|
||||
};
|
||||
database.TablesTypes.Add((TableType)item);
|
||||
}
|
||||
}
|
||||
if (isTable)
|
||||
{
|
||||
if (database.Options.Ignore.FilterTable)
|
||||
FillColumn((ITable<Table>)item, reader);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (database.Options.Ignore.FilterUserDataType)
|
||||
FillColumn((ITable<TableType>)item, reader);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//tables.ToSQL();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
using System;
|
||||
using System.Data.SqlClient;
|
||||
using System.Text.RegularExpressions;
|
||||
using OpenDBDiff.Schema.Events;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Options;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateTextObjects
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateTextObjects(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQL(SqlOption options)
|
||||
{
|
||||
var filterQuery = SQLQueries.SQLQueryFactory.Get("GetTextObjectsQuery");
|
||||
string filter = "";
|
||||
if (options.Ignore.FilterStoredProcedure)
|
||||
filter += "O.type = 'P' OR ";
|
||||
if (options.Ignore.FilterView)
|
||||
filter += "O.type = 'V' OR ";
|
||||
if (options.Ignore.FilterTrigger)
|
||||
filter += "O.type = 'TR' OR ";
|
||||
if (options.Ignore.FilterFunction)
|
||||
filter += "O.type IN ('IF','FN','TF') OR ";
|
||||
filter = filter.Substring(0, filter.Length - 4);
|
||||
return filterQuery.Replace("{FILTER}", filter);
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString)
|
||||
{
|
||||
ICode code = null;
|
||||
try
|
||||
{
|
||||
if ((database.Options.Ignore.FilterStoredProcedure) || (database.Options.Ignore.FilterView) || (database.Options.Ignore.FilterFunction) || (database.Options.Ignore.FilterTrigger))
|
||||
{
|
||||
root.RaiseOnReading(new ProgressEventArgs("Reading Text Objects...", Constants.READING_TEXTOBJECTS));
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQL(database.Options), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
code = null;
|
||||
root.RaiseOnReadingOne(reader["name"]);
|
||||
string type = reader["Type"].ToString().Trim();
|
||||
string name = reader["name"].ToString();
|
||||
string definition = reader["Text"].ToString();
|
||||
int id = (int)reader["object_id"];
|
||||
if (type.Equals("V"))
|
||||
code = (ICode)database.Views.Find(id);
|
||||
|
||||
if (type.Equals("TR"))
|
||||
code = (ICode)database.Find(id);
|
||||
|
||||
if (type.Equals("P"))
|
||||
{
|
||||
var procedure = database.Procedures.Find(id);
|
||||
if (procedure != null)
|
||||
((ICode)procedure).Text = GetObjectDefinition(type, name, definition);
|
||||
}
|
||||
|
||||
if (type.Equals("IF") || type.Equals("FN") || type.Equals("TF"))
|
||||
code = (ICode)database.Functions.Find(id);
|
||||
|
||||
if (code != null)
|
||||
code.Text = reader["Text"].ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
|
||||
private string GetObjectDefinition(string type, string name, string definition)
|
||||
{
|
||||
string rv = definition;
|
||||
|
||||
string sqlDelimiters = @"(\r|\n|\s)+?";
|
||||
RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Multiline;
|
||||
Regex re = new Regex(@"CREATE" + sqlDelimiters + @"PROC(EDURE)?" + sqlDelimiters + @"(\w+\.|\[\w+\]\.)?\[?(?<spname>\w+)\]?" + sqlDelimiters, options);
|
||||
switch (type)
|
||||
{
|
||||
case "P":
|
||||
Match match = re.Match(definition);
|
||||
if (match != null && match.Success)
|
||||
{
|
||||
// Try to replace the name saved in the definition when the object was created by the one used for the object in sys.object
|
||||
string oldName = match.Groups["spname"].Value;
|
||||
//if (String.IsNullOrEmpty(oldName)) System.Diagnostics.Debugger.Break();
|
||||
if (String.Compare(oldName, name) != 0)
|
||||
{
|
||||
rv = rv.Replace(oldName, name);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
//TODO : Add the logic used for other objects than procedures
|
||||
break;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.Errors;
|
||||
using OpenDBDiff.Schema.Events;
|
||||
using OpenDBDiff.Schema.Model;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Options;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateTriggers
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateTriggers(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQL(DatabaseInfo.SQLServerVersion version, SqlOption options)
|
||||
{
|
||||
if (version == DatabaseInfo.SQLServerVersion.SQLServerAzure10)
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetTriggers", version);
|
||||
}
|
||||
else
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetTriggers");
|
||||
}
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString, List<MessageLog> messages)
|
||||
{
|
||||
int parentId = 0;
|
||||
ISchemaBase parent = null;
|
||||
string type;
|
||||
try
|
||||
{
|
||||
if (database.Options.Ignore.FilterTrigger)
|
||||
{
|
||||
root.RaiseOnReading(new ProgressEventArgs("Reading Triggers...", Constants.READING_TRIGGERS));
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQL(database.Info.Version, database.Options), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
root.RaiseOnReadingOne(reader["Name"]);
|
||||
type = reader["ObjectType"].ToString().Trim();
|
||||
if (parentId != (int)reader["parent_id"])
|
||||
{
|
||||
parentId = (int)reader["parent_id"];
|
||||
if (type.Equals("V"))
|
||||
parent = database.Views.Find(parentId);
|
||||
else
|
||||
parent = database.Tables.Find(parentId);
|
||||
}
|
||||
if (reader["type"].Equals("TR"))
|
||||
{
|
||||
Trigger item = new Trigger(parent);
|
||||
item.Id = (int)reader["object_id"];
|
||||
item.Name = reader["Name"].ToString();
|
||||
item.InsteadOf = (bool)reader["is_instead_of_trigger"];
|
||||
item.IsDisabled = (bool)reader["is_disabled"];
|
||||
item.IsDDLTrigger = false;
|
||||
item.Owner = reader["Owner"].ToString();
|
||||
if (database.Options.Ignore.FilterNotForReplication)
|
||||
item.NotForReplication = (bool)reader["is_not_for_replication"];
|
||||
if (type.Equals("V"))
|
||||
((View)parent).Triggers.Add(item);
|
||||
else
|
||||
((Table)parent).Triggers.Add(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
CLRTrigger item = new CLRTrigger(parent);
|
||||
item.Id = (int)reader["object_id"];
|
||||
item.Name = reader["Name"].ToString();
|
||||
item.IsDelete = (bool)reader["IsDelete"];
|
||||
item.IsUpdate = (bool)reader["IsUpdate"];
|
||||
item.IsInsert = (bool)reader["IsInsert"];
|
||||
item.Owner = reader["Owner"].ToString();
|
||||
item.IsAssembly = true;
|
||||
item.AssemblyId = (int)reader["assembly_id"];
|
||||
item.AssemblyName = reader["assembly_name"].ToString();
|
||||
item.AssemblyClass = reader["assembly_class"].ToString();
|
||||
item.AssemblyExecuteAs = reader["ExecuteAs"].ToString();
|
||||
item.AssemblyMethod = reader["assembly_method"].ToString();
|
||||
if (type.Equals("V"))
|
||||
((View)parent).CLRTriggers.Add(item);
|
||||
else
|
||||
((Table)parent).CLRTriggers.Add(item);
|
||||
/*if (!database.Options.Ignore.FilterIgnoreNotForReplication)
|
||||
trigger.NotForReplication = (bool)reader["is_not_for_replication"];*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
messages.Add(new MessageLog(ex.Message, ex.StackTrace, MessageLog.LogType.Error));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.Errors;
|
||||
using OpenDBDiff.Schema.Events;
|
||||
using OpenDBDiff.Schema.Model;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateUserDataTypes
|
||||
{
|
||||
private readonly Generate root;
|
||||
|
||||
public GenerateUserDataTypes(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQLColumnsDependencies()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetSQLColumnsDependencies");
|
||||
}
|
||||
|
||||
private static void FillColumnsDependencies(SchemaList<UserDataType, Database> types, string connectionString)
|
||||
{
|
||||
if (types == null) throw new ArgumentNullException("types");
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQLColumnsDependencies(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
types[reader["TypeName"].ToString()].Dependencies.Add(new ObjectDependency(reader["TableName"].ToString(), reader["ColumnName"].ToString(), ConvertType.GetObjectType(reader["Type"].ToString())));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString, List<MessageLog> messages)
|
||||
{
|
||||
//not supported in azure yet http://msdn.microsoft.com/en-us/library/ee336233.aspx
|
||||
if (database.Info.Version == DatabaseInfo.SQLServerVersion.SQLServerAzure10) return;
|
||||
|
||||
try
|
||||
{
|
||||
if (database.Options.Ignore.FilterUserDataType)
|
||||
{
|
||||
root.RaiseOnReading(new ProgressEventArgs("Reading UDT...", Constants.READING_UDT));
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(UserDataTypeCommand.Get(database.Info.Version, database.Info.Edition), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
root.RaiseOnReadingOne(reader["Name"]);
|
||||
UserDataType item = new UserDataType(database);
|
||||
item.Id = (int)reader["tid"];
|
||||
item.AllowNull = (bool)reader["is_nullable"];
|
||||
item.Size = (short)reader["max_length"];
|
||||
item.Name = reader["Name"].ToString();
|
||||
item.Owner = reader["owner"].ToString();
|
||||
item.Precision = int.Parse(reader["precision"].ToString());
|
||||
item.Scale = int.Parse(reader["scale"].ToString());
|
||||
if (!String.IsNullOrEmpty(reader["defaultname"].ToString()))
|
||||
{
|
||||
item.Default.Name = reader["defaultname"].ToString();
|
||||
item.Default.Owner = reader["defaultowner"].ToString();
|
||||
}
|
||||
if (!String.IsNullOrEmpty(reader["rulename"].ToString()))
|
||||
{
|
||||
item.Rule.Name = reader["rulename"].ToString();
|
||||
item.Rule.Owner = reader["ruleowner"].ToString();
|
||||
}
|
||||
item.Type = reader["basetypename"].ToString();
|
||||
item.IsAssembly = (bool)reader["is_assembly_type"];
|
||||
item.AssemblyId = (int)reader["assembly_id"];
|
||||
item.AssemblyName = reader["assembly_name"].ToString();
|
||||
item.AssemblyClass = reader["assembly_class"].ToString();
|
||||
database.UserTypes.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (database.Options.Ignore.FilterTable)
|
||||
FillColumnsDependencies(database.UserTypes, connectionString);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
messages.Add(new MessageLog(ex.Message, ex.StackTrace, MessageLog.LogType.Error));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
using System;
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateUsers
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateUsers(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectioString)
|
||||
{
|
||||
string type;
|
||||
if ((database.Options.Ignore.FilterUsers) || (database.Options.Ignore.FilterRoles))
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectioString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(UserSQLCommand.Get(database.Info.Version, database.Info.Edition), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
type = reader["type"].ToString();
|
||||
if (database.Options.Ignore.FilterUsers && (type.Equals("S") || type.Equals("U")))
|
||||
{
|
||||
User item = new User(database);
|
||||
item.Id = (int)reader["principal_id"];
|
||||
item.Name = reader["name"].ToString();
|
||||
item.Login = reader["Login"].ToString();
|
||||
item.Owner = reader["default_schema_name"].ToString();
|
||||
database.Users.Add(item);
|
||||
}
|
||||
if (database.Options.Ignore.FilterRoles && (type.Equals("A") || type.Equals("R")))
|
||||
{
|
||||
Role item = new Role(database);
|
||||
item.Id = (int)reader["principal_id"];
|
||||
item.Name = reader["name"].ToString();
|
||||
item.Owner = reader["default_schema_name"].ToString();
|
||||
item.Password = "";
|
||||
item.IsSystem = (Boolean)reader["is_fixed_role"];
|
||||
if (type.Equals("A"))
|
||||
item.Type = Role.RoleTypeEnum.ApplicationRole;
|
||||
else
|
||||
item.Type = Role.RoleTypeEnum.DatabaseRole;
|
||||
database.Roles.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.SqlClient;
|
||||
using OpenDBDiff.Schema.Errors;
|
||||
using OpenDBDiff.Schema.Events;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateViews
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateViews(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString, List<MessageLog> messages)
|
||||
{
|
||||
try
|
||||
{
|
||||
root.RaiseOnReading(new ProgressEventArgs("Reading views...", Constants.READING_VIEWS));
|
||||
if (database.Options.Ignore.FilterView)
|
||||
{
|
||||
FillView(database, connectionString);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
messages.Add(new MessageLog(ex.Message, ex.StackTrace, MessageLog.LogType.Error));
|
||||
}
|
||||
}
|
||||
|
||||
private void FillView(Database database, string connectionString)
|
||||
{
|
||||
int lastViewId = 0;
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(ViewSQLCommand.GetView(database.Info.Version, database.Info.Edition), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
View item = null;
|
||||
while (reader.Read())
|
||||
{
|
||||
root.RaiseOnReadingOne(reader["name"]);
|
||||
if (lastViewId != (int)reader["object_id"])
|
||||
{
|
||||
item = new View(database);
|
||||
item.Id = (int)reader["object_id"];
|
||||
item.Name = reader["name"].ToString();
|
||||
item.Owner = reader["owner"].ToString();
|
||||
item.IsSchemaBinding = reader["IsSchemaBound"].ToString().Equals("1");
|
||||
database.Views.Add(item);
|
||||
lastViewId = item.Id;
|
||||
}
|
||||
if (item.IsSchemaBinding)
|
||||
{
|
||||
if (!reader.IsDBNull(reader.GetOrdinal("referenced_major_id")))
|
||||
database.Dependencies.Add(database, (int)reader["referenced_major_id"], item);
|
||||
if (!String.IsNullOrEmpty(reader["TableName"].ToString()))
|
||||
item.DependenciesIn.Add(reader["TableName"].ToString());
|
||||
if (!String.IsNullOrEmpty(reader["DependOut"].ToString()))
|
||||
item.DependenciesOut.Add(reader["DependOut"].ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
using System.Data.SqlClient;
|
||||
using System.Text;
|
||||
using OpenDBDiff.Schema.Events;
|
||||
using OpenDBDiff.Schema.Model;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
||||
{
|
||||
public class GenerateXMLSchemas
|
||||
{
|
||||
private Generate root;
|
||||
|
||||
public GenerateXMLSchemas(Generate root)
|
||||
{
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
private static string GetSQLColumnsDependencies()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetXMLSchemaCollections");
|
||||
}
|
||||
|
||||
private static string GetSQLXMLSchema()
|
||||
{
|
||||
return SQLQueries.SQLQueryFactory.Get("GetSQLXMLSchema");
|
||||
}
|
||||
|
||||
private static void FillColumnsDependencies(SchemaList<XMLSchema, Database> items, string connectionString)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQLColumnsDependencies(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
items[reader["XMLName"].ToString()].Dependencies.Add(new ObjectDependency(reader["TableName"].ToString(), reader["ColumnName"].ToString(), ConvertType.GetObjectType(reader["Type"].ToString())));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Fill(Database database, string connectionString)
|
||||
{
|
||||
//TODO XML_SCHEMA_NAMESPACE function not supported in Azure, is there a workaround?
|
||||
//not supported in azure yet
|
||||
if (database.Info.Version == DatabaseInfo.SQLServerVersion.SQLServerAzure10) return;
|
||||
|
||||
|
||||
if (database.Options.Ignore.FilterXMLSchema)
|
||||
{
|
||||
root.RaiseOnReading(new ProgressEventArgs("Reading XML Schema...", Constants.READING_XMLSCHEMAS));
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlCommand command = new SqlCommand(GetSQLXMLSchema(), conn))
|
||||
{
|
||||
conn.Open();
|
||||
command.CommandTimeout = 0;
|
||||
using (SqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
root.RaiseOnReadingOne(reader["name"]);
|
||||
XMLSchema item = new XMLSchema(database);
|
||||
item.Id = (int)reader["ID"];
|
||||
item.Name = reader["name"].ToString();
|
||||
item.Owner = reader["owner"].ToString();
|
||||
item.Text = reader["Text"].ToString();
|
||||
database.XmlSchemas.Add(item);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (database.Options.Ignore.FilterTable)
|
||||
FillColumnsDependencies(database.XmlSchemas, connectionString);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,192 @@
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
using System.Text;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands
|
||||
{
|
||||
internal static class ConstraintSQLCommand
|
||||
{
|
||||
public static string GetUniqueKey(DatabaseInfo.SQLServerVersion version, DatabaseInfo.SQLServerEdition edition)
|
||||
{
|
||||
switch (version)
|
||||
{
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2005:
|
||||
return GetUniqueKey2005();
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServerAzure10:
|
||||
return GetUniqueKeyAzure();
|
||||
|
||||
default:
|
||||
if (edition == DatabaseInfo.SQLServerEdition.Azure)
|
||||
return GetUniqueKeyAzure();
|
||||
else
|
||||
return GetUniqueKey2008();
|
||||
}
|
||||
}
|
||||
|
||||
public static string GetCheck(DatabaseInfo.SQLServerVersion version)
|
||||
{
|
||||
if (version == DatabaseInfo.SQLServerVersion.SQLServer2005) return GetCheck2005();
|
||||
//Fall back to highest compatible version
|
||||
return GetCheck2008();
|
||||
}
|
||||
|
||||
public static string GetPrimaryKey(DatabaseInfo.SQLServerVersion version, Table table)
|
||||
{
|
||||
switch (version)
|
||||
{
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2000:
|
||||
return GetPrimaryKey2000(table);
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2005:
|
||||
return GetPrimaryKey2005();
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServerAzure10:
|
||||
return GetPrimaryKeyAzure();
|
||||
|
||||
default:
|
||||
return GetPrimaryKey2008();
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetUniqueKeyAzure()
|
||||
{
|
||||
//File Groups not supported in Azure
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.Append("SELECT O.type as ObjectType, S.Name as Owner, I.object_Id AS id,'' as FileGroup, C.user_type_id, C.column_id, I.Index_id, C.Name AS ColumnName, I.Name, I.type, I.fill_factor, I.is_padded, I.allow_row_locks, I.allow_page_locks, I.ignore_dup_key, I.is_disabled, IC.is_descending_key, IC.is_included_column ");
|
||||
sql.Append("FROM sys.indexes I ");
|
||||
sql.Append("INNER JOIN sys.objects O ON O.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.schemas S ON S.schema_id = O.schema_id ");
|
||||
sql.Append("INNER JOIN sys.index_columns IC ON IC.index_id = I.index_id AND IC.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.columns C ON C.column_id = IC.column_id AND IC.object_id = C.object_id ");
|
||||
//sql.Append("LEFT JOIN sys.data_spaces AS dsidx ON dsidx.data_space_id = I.data_space_id ");
|
||||
sql.Append("WHERE is_unique_constraint = 1 AND O.type <> 'TF' ORDER BY I.object_id,I.Name");
|
||||
return sql.ToString();
|
||||
}
|
||||
|
||||
private static string GetUniqueKey2008()
|
||||
{
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.Append("SELECT O.type as ObjectType, S.Name as Owner, I.object_Id AS id,dsidx.Name as FileGroup, C.user_type_id, C.column_id, I.Index_id, C.Name AS ColumnName, I.Name, I.type, I.fill_factor, I.is_padded, I.allow_row_locks, I.allow_page_locks, I.ignore_dup_key, I.is_disabled, IC.is_descending_key, IC.is_included_column ");
|
||||
sql.Append("FROM sys.indexes I ");
|
||||
sql.Append("INNER JOIN sys.objects O ON O.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.schemas S ON S.schema_id = O.schema_id ");
|
||||
sql.Append("INNER JOIN sys.index_columns IC ON IC.index_id = I.index_id AND IC.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.columns C ON C.column_id = IC.column_id AND IC.object_id = C.object_id ");
|
||||
sql.Append("LEFT JOIN sys.data_spaces AS dsidx ON dsidx.data_space_id = I.data_space_id ");
|
||||
sql.Append("WHERE is_unique_constraint = 1 AND O.type <> 'TF' ORDER BY I.object_id,I.Name");
|
||||
return sql.ToString();
|
||||
}
|
||||
|
||||
private static string GetUniqueKey2005()
|
||||
{
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.Append("SELECT O.type as ObjectType, S.Name as Owner, I.object_Id AS id,dsidx.Name as FileGroup, C.user_type_id, C.column_id, I.Index_id, C.Name AS ColumnName, I.Name, I.type, I.fill_factor, I.is_padded, I.allow_row_locks, I.allow_page_locks, I.ignore_dup_key, I.is_disabled, IC.is_descending_key, IC.is_included_column ");
|
||||
sql.Append("FROM sys.indexes I ");
|
||||
sql.Append("INNER JOIN sys.objects O ON O.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.schemas S ON S.schema_id = O.schema_id ");
|
||||
sql.Append("INNER JOIN sys.index_columns IC ON IC.index_id = I.index_id AND IC.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.columns C ON C.column_id = IC.column_id AND IC.object_id = C.object_id ");
|
||||
sql.Append("LEFT JOIN sys.data_spaces AS dsidx ON dsidx.data_space_id = I.data_space_id ");
|
||||
sql.Append("WHERE is_unique_constraint = 1 AND O.type <> 'TF' ORDER BY I.object_id,I.Name");
|
||||
return sql.ToString();
|
||||
}
|
||||
|
||||
private static string GetCheck2008()
|
||||
{
|
||||
string sql;
|
||||
sql = "SELECT ";
|
||||
sql += "CC.parent_object_id, ";
|
||||
sql += "O.type as ObjectType, ";
|
||||
sql += "CC.object_id AS ID, ";
|
||||
sql += "CC.parent_column_id, ";
|
||||
sql += "CC.name, ";
|
||||
sql += "CC.type, ";
|
||||
sql += "CC.definition, ";
|
||||
sql += "CC.is_disabled, ";
|
||||
sql += "CC.is_not_trusted AS WithCheck, ";
|
||||
sql += "CC.is_not_for_replication, ";
|
||||
sql += "0, ";
|
||||
sql += "schema_name(CC.schema_id) AS Owner ";
|
||||
sql += "FROM sys.check_constraints CC ";
|
||||
sql += "INNER JOIN sys.objects O ON O.object_id = CC.parent_object_id ";
|
||||
sql += "ORDER BY CC.parent_object_id,CC.name";
|
||||
return sql;
|
||||
}
|
||||
|
||||
private static string GetCheck2005()
|
||||
{
|
||||
string sql;
|
||||
sql = "SELECT ";
|
||||
sql += "CC.parent_object_id, ";
|
||||
sql += "O.Type as ObjectType, ";
|
||||
sql += "CC.object_id AS ID, ";
|
||||
sql += "CC.parent_column_id, ";
|
||||
sql += "CC.name, ";
|
||||
sql += "CC.type, ";
|
||||
sql += "CC.definition, ";
|
||||
sql += "CC.is_disabled, ";
|
||||
sql += "CC.is_not_trusted AS WithCheck, ";
|
||||
sql += "CC.is_not_for_replication, ";
|
||||
sql += "0, ";
|
||||
sql += "schema_name(CC.schema_id) AS Owner ";
|
||||
sql += "FROM sys.check_constraints CC ";
|
||||
sql += "INNER JOIN sys.objects O ON O.object_id = CC.parent_object_id ";
|
||||
sql += "ORDER BY CC.parent_object_id,CC.name";
|
||||
return sql;
|
||||
}
|
||||
|
||||
private static string GetPrimaryKeyAzure()
|
||||
{
|
||||
//File Groups not supported in Azure
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.Append("SELECT O.type as ObjectType, S.Name as Owner, IC.key_ordinal, C.user_type_id, I.object_id AS ID, '' AS FileGroup, C.column_id, I.Index_id, C.Name AS ColumnName, I.Name, I.type, I.fill_factor, I.is_padded, I.allow_row_locks, I.allow_page_locks, I.ignore_dup_key, I.is_disabled, IC.is_descending_key, IC.is_included_column, CONVERT(bit,INDEXPROPERTY(I.object_id,I.name,'IsAutoStatistics')) AS IsAutoStatistics ");
|
||||
sql.Append("FROM sys.indexes I ");
|
||||
sql.Append("INNER JOIN sys.objects O ON O.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.schemas S ON S.schema_id = O.schema_id ");
|
||||
sql.Append("INNER JOIN sys.index_columns IC ON IC.index_id = I.index_id AND IC.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.columns C ON C.column_id = IC.column_id AND IC.object_id = C.object_id ");
|
||||
//sql.Append("LEFT JOIN sys.data_spaces AS dsidx ON dsidx.data_space_id = I.data_space_id ");
|
||||
sql.Append("WHERE is_primary_key = 1 AND O.type <> 'TF' ORDER BY I.object_id");
|
||||
return sql.ToString();
|
||||
}
|
||||
|
||||
private static string GetPrimaryKey2008()
|
||||
{
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.Append("SELECT O.type as ObjectType, S.Name as Owner, IC.key_ordinal, C.user_type_id, I.object_id AS ID, dsidx.Name AS FileGroup, C.column_id, I.Index_id, C.Name AS ColumnName, I.Name, I.type, I.fill_factor, I.is_padded, I.allow_row_locks, I.allow_page_locks, I.ignore_dup_key, I.is_disabled, IC.is_descending_key, IC.is_included_column, CONVERT(bit,INDEXPROPERTY(I.object_id,I.name,'IsAutoStatistics')) AS IsAutoStatistics ");
|
||||
sql.Append("FROM sys.indexes I ");
|
||||
sql.Append("INNER JOIN sys.objects O ON O.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.schemas S ON S.schema_id = O.schema_id ");
|
||||
sql.Append("INNER JOIN sys.index_columns IC ON IC.index_id = I.index_id AND IC.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.columns C ON C.column_id = IC.column_id AND IC.object_id = C.object_id ");
|
||||
sql.Append("LEFT JOIN sys.data_spaces AS dsidx ON dsidx.data_space_id = I.data_space_id ");
|
||||
sql.Append("WHERE is_primary_key = 1 AND O.type <> 'TF' ORDER BY I.object_id");
|
||||
return sql.ToString();
|
||||
}
|
||||
|
||||
private static string GetPrimaryKey2005()
|
||||
{
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.Append("SELECT O.type as ObjectType, S.Name as Owner, IC.key_ordinal, C.user_type_id, I.object_id AS ID, dsidx.Name AS FileGroup, C.column_id, I.Index_id, C.Name AS ColumnName, I.Name, I.type, I.fill_factor, I.is_padded, I.allow_row_locks, I.allow_page_locks, I.ignore_dup_key, I.is_disabled, IC.is_descending_key, IC.is_included_column, CONVERT(bit,INDEXPROPERTY(I.object_id,I.name,'IsAutoStatistics')) AS IsAutoStatistics ");
|
||||
sql.Append("FROM sys.indexes I ");
|
||||
sql.Append("INNER JOIN sys.objects O ON O.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.schemas S ON S.schema_id = O.schema_id ");
|
||||
sql.Append("INNER JOIN sys.index_columns IC ON IC.index_id = I.index_id AND IC.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.columns C ON C.column_id = IC.column_id AND IC.object_id = C.object_id ");
|
||||
sql.Append("INNER JOIN sys.data_spaces AS dsidx ON dsidx.data_space_id = I.data_space_id ");
|
||||
sql.Append("WHERE is_primary_key = 1 AND O.type <> 'TF' ORDER BY I.object_id");
|
||||
return sql.ToString();
|
||||
}
|
||||
|
||||
private static string GetPrimaryKey2000(Table table)
|
||||
{
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.Append("SELECT CONVERT(tinyint,CASE WHEN SI.indid = 0 THEN 0 WHEN SI.indid = 1 THEN 1 WHEN SI.indid > 1 THEN 2 END) AS Type,f.groupname AS FileGroup,CONVERT(int,SI.indid) AS Index_id, CONVERT(int,SI.indid) AS ID, SI.name, SC.colid, SC.Name AS ColumnName, CONVERT(bit,0) AS is_included_column, SIK.keyno AS key_ordinal, CONVERT(bit,INDEXPROPERTY(SI.id,SI.name,'IsPadIndex')) AS is_padded, CONVERT(bit,INDEXPROPERTY(SI.id,SI.name,'IsRowLockDisallowed')) AS allow_row_locks, CONVERT(bit,INDEXPROPERTY(SI.id,SI.name,'IsPageLockDisallowed')) AS allow_page_locks, CONVERT(bit,INDEXPROPERTY(SI.id,SI.name,'IsAutoStatistics')) AS IsAutoStatistics, CONVERT(tinyint,INDEXPROPERTY(SI.id,SI.name,'IndexFillFactor')) AS fill_factor, INDEXKEY_PROPERTY(SI.id, SI.indid,SC.colid,'IsDescending') AS is_descending_key, CONVERT(bit,0) AS is_disabled, CONVERT(bit,0) AS is_included_column ");
|
||||
sql.Append("FROM sysindexes SI INNER JOIN sysindexkeys SIK ON SI.indid = SIK.indid AND SIK.id = SI.ID ");
|
||||
sql.Append("INNER JOIN syscolumns SC ON SC.colid = SIK.colid AND SC.id = SI.ID ");
|
||||
sql.Append("inner join sysfilegroups f on f.groupid = SI.groupid ");
|
||||
sql.Append("WHERE (SI.status & 0x800) = 0x800 AND SI.id = " + table.Id.ToString() + " ORDER BY SIK.keyno");
|
||||
return sql.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands
|
||||
{
|
||||
internal class DatabaseSQLCommand
|
||||
{
|
||||
public static string GetVersion(Database databaseSchema)
|
||||
{
|
||||
string sql;
|
||||
sql = "SELECT SERVERPROPERTY('productversion') AS Version, SERVERPROPERTY('EngineEdition') AS Edition";
|
||||
return sql;
|
||||
}
|
||||
|
||||
public static string Get(DatabaseInfo.SQLServerVersion version, DatabaseInfo.SQLServerEdition edition, Database databaseSchema)
|
||||
{
|
||||
switch (version)
|
||||
{
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2005:
|
||||
return Get2005(databaseSchema);
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2008:
|
||||
return Get2008(databaseSchema);
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2008R2:
|
||||
return Get2008R2(databaseSchema);
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServerAzure10:
|
||||
return GetAzure(databaseSchema);
|
||||
|
||||
default:
|
||||
if (edition == DatabaseInfo.SQLServerEdition.Azure)
|
||||
return GetAzure(databaseSchema);
|
||||
else
|
||||
return Get2008R2(databaseSchema);
|
||||
}
|
||||
}
|
||||
|
||||
private static string Get2005(Database databaseSchema)
|
||||
{
|
||||
string sql;
|
||||
sql = "SELECT DATABASEPROPERTYEX('" + databaseSchema.Name + "','IsFulltextEnabled') AS IsFullTextEnabled, DATABASEPROPERTYEX('" + databaseSchema.Name + "','Collation') AS Collation";
|
||||
return sql;
|
||||
}
|
||||
|
||||
private static string Get2008(Database databaseSchema)
|
||||
{
|
||||
string sql;
|
||||
sql = "SELECT DATABASEPROPERTYEX('" + databaseSchema.Name + "','IsFulltextEnabled') AS IsFullTextEnabled, DATABASEPROPERTYEX('" + databaseSchema.Name + "','Collation') AS Collation";
|
||||
return sql;
|
||||
}
|
||||
|
||||
private static string Get2008R2(Database databaseSchema)
|
||||
{
|
||||
string sql;
|
||||
sql = "SELECT DATABASEPROPERTYEX('" + databaseSchema.Name + "','IsFulltextEnabled') AS IsFullTextEnabled, DATABASEPROPERTYEX('" + databaseSchema.Name + "','Collation') AS Collation";
|
||||
return sql;
|
||||
}
|
||||
|
||||
private static string GetAzure(Database databaseSchema)
|
||||
{
|
||||
string sql;
|
||||
//DATABASEPROPERTYEX('IsFullTextEnabled') is deprecated http://technet.microsoft.com/en-us/library/cc646010(SQL.110).aspx
|
||||
sql = "SELECT 0 AS IsFullTextEnabled, DATABASEPROPERTYEX('" + databaseSchema.Name + "','Collation') AS Collation";
|
||||
return sql;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
using System.Text;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands
|
||||
{
|
||||
internal static class FullTextIndexSQLCommand
|
||||
{
|
||||
public static string Get(DatabaseInfo.SQLServerVersion version)
|
||||
{
|
||||
switch (version)
|
||||
{
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2005:
|
||||
return Get2005();
|
||||
|
||||
default:
|
||||
return Get2008();
|
||||
}
|
||||
}
|
||||
|
||||
private static string Get2005()
|
||||
{
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.Append("SELECT ");
|
||||
sql.Append("FI.object_id, ");
|
||||
sql.Append("T.Name AS TableName, ");
|
||||
sql.Append("FC.name AS FullTextCatalogName, ");
|
||||
sql.Append("I.name AS IndexName, ");
|
||||
sql.Append("FI.is_enabled, ");
|
||||
sql.Append("'['+ S.name + '].['+ T.name + '].[' + FC.name + ']' AS Name, ");
|
||||
sql.Append("C.name as ColumnName, ");
|
||||
sql.Append("FI.change_tracking_state_desc AS ChangeTracking, ");
|
||||
sql.Append("FL.name AS LanguageName ");
|
||||
sql.Append("FROM sys.fulltext_indexes FI ");
|
||||
sql.Append("INNER JOIN sys.fulltext_catalogs FC ON FC.fulltext_catalog_id = FI.fulltext_catalog_id ");
|
||||
sql.Append("INNER JOIN sys.indexes I ON I.index_id = FI.unique_index_id and I.object_id = FI.object_id ");
|
||||
sql.Append("INNER JOIN sys.tables T ON T.object_id = FI.object_id ");
|
||||
sql.Append("INNER JOIN sys.schemas S ON S.schema_id = T.schema_id ");
|
||||
sql.Append("INNER JOIN sys.fulltext_index_columns FIC ON FIC.object_id = FI.object_id ");
|
||||
sql.Append("INNER JOIN sys.columns C ON C.object_id = FIC.object_id AND C.column_id = FIC.column_id ");
|
||||
sql.Append("INNER JOIN sys.fulltext_languages FL ON FL.lcid = FIC.language_id ");
|
||||
sql.Append("ORDER BY OBJECT_NAME(FI.object_id), I.name ");
|
||||
return sql.ToString();
|
||||
}
|
||||
|
||||
private static string Get2008()
|
||||
{
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.Append("SELECT ");
|
||||
sql.Append("FI.object_id, ");
|
||||
sql.Append("T.Name AS TableName, ");
|
||||
sql.Append("FC.name AS FullTextCatalogName, ");
|
||||
sql.Append("I.name AS IndexName, ");
|
||||
sql.Append("FI.is_enabled, ");
|
||||
sql.Append("'['+ S.name + '].['+ T.name + '].[' + FC.name + ']' AS Name, ");
|
||||
sql.Append("C.name as ColumnName, ");
|
||||
sql.Append("FL.name AS LanguageName,");
|
||||
sql.Append("DS.name AS FileGroupName, ");
|
||||
sql.Append("FI.change_tracking_state_desc AS ChangeTracking ");
|
||||
sql.Append("FROM sys.fulltext_indexes FI ");
|
||||
sql.Append("INNER JOIN sys.fulltext_catalogs FC ON FC.fulltext_catalog_id = FI.fulltext_catalog_id ");
|
||||
sql.Append("INNER JOIN sys.indexes I ON I.index_id = FI.unique_index_id and I.object_id = FI.object_id ");
|
||||
sql.Append("INNER JOIN sys.tables T ON T.object_id = FI.object_id ");
|
||||
sql.Append("INNER JOIN sys.schemas S ON S.schema_id = T.schema_id ");
|
||||
sql.Append("INNER JOIN sys.fulltext_index_columns FIC ON FIC.object_id = FI.object_id ");
|
||||
sql.Append("INNER JOIN sys.columns C ON C.object_id = FIC.object_id AND C.column_id = FIC.column_id ");
|
||||
sql.Append("INNER JOIN sys.data_spaces DS ON DS.data_space_id = FI.data_space_id ");
|
||||
sql.Append("INNER JOIN sys.fulltext_languages FL ON FL.lcid = FIC.language_id ");
|
||||
sql.Append("ORDER BY OBJECT_NAME(FI.object_id), I.name ");
|
||||
return sql.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
using System.Text;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands
|
||||
{
|
||||
internal static class FunctionSQLCommand
|
||||
{
|
||||
public static string Get(DatabaseInfo.SQLServerVersion version, DatabaseInfo.SQLServerEdition edition)
|
||||
{
|
||||
switch (version)
|
||||
{
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2005:
|
||||
return Get2005();
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2008:
|
||||
return Get2008();
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServerAzure10:
|
||||
return GetAzure();
|
||||
|
||||
default:
|
||||
if (edition == DatabaseInfo.SQLServerEdition.Azure)
|
||||
return GetAzure();
|
||||
else
|
||||
return Get2008();
|
||||
}
|
||||
}
|
||||
|
||||
private static string Get2005()
|
||||
{
|
||||
string sql = "";
|
||||
sql += "select distinct ";
|
||||
sql += "T.name AS ReturnType, PP.max_length, PP.precision, PP.Scale, ";
|
||||
sql += "ISNULL(CONVERT(varchar,AM.execute_as_principal_id),'CALLER') as ExecuteAs, ";
|
||||
sql += "P.type, ";
|
||||
sql += "AF.name AS assembly_name, ";
|
||||
sql += "AM.assembly_class, ";
|
||||
sql += "AM.assembly_id, ";
|
||||
sql += "AM.assembly_method, ";
|
||||
sql += "ISNULL('[' + S3.Name + '].[' + object_name(D2.object_id) + ']','') AS DependOut, '[' + S2.Name + '].[' + object_name(D.referenced_major_id) + ']' AS TableName, D.referenced_major_id, OBJECTPROPERTY (P.object_id,'IsSchemaBound') AS IsSchemaBound, P.object_id, S.name as owner, P.name as name from sys.objects P ";
|
||||
sql += "INNER JOIN sys.schemas S ON S.schema_id = P.schema_id ";
|
||||
sql += "LEFT JOIN sys.sql_dependencies D ON P.object_id = D.object_id ";
|
||||
sql += "LEFT JOIN sys.objects O ON O.object_id = D.referenced_major_id ";
|
||||
sql += "LEFT JOIN sys.schemas S2 ON S2.schema_id = O.schema_id ";
|
||||
sql += "LEFT JOIN sys.sql_dependencies D2 ON P.object_id = D2.referenced_major_id ";
|
||||
sql += "LEFT JOIN sys.objects O2 ON O2.object_id = D2.object_id ";
|
||||
sql += "LEFT JOIN sys.schemas S3 ON S3.schema_id = O2.schema_id ";
|
||||
sql += "LEFT JOIN sys.assembly_modules AM ON AM.object_id = P.object_id ";
|
||||
sql += "LEFT JOIN sys.assemblies AF ON AF.assembly_id = AM.assembly_id ";
|
||||
sql += "LEFT JOIN sys.parameters PP ON PP.object_id = AM.object_id AND PP.parameter_id = 0 and PP.is_output = 1 ";
|
||||
sql += "LEFT JOIN sys.types T ON T.system_type_id = PP.system_type_id ";
|
||||
sql += "WHERE P.type IN ('IF','FN','TF','FS') ORDER BY P.object_id";
|
||||
return sql;
|
||||
}
|
||||
|
||||
private static string Get2008()
|
||||
{
|
||||
var sql = new StringBuilder();
|
||||
sql.AppendLine("SELECT DISTINCT ");
|
||||
sql.AppendLine("T.name AS ReturnType, PP.max_length, PP.precision, PP.Scale, ");
|
||||
sql.AppendLine("ISNULL(CONVERT(varchar,AM.execute_as_principal_id),'CALLER') as ExecuteAs, ");
|
||||
sql.AppendLine("P.type, ");
|
||||
sql.AppendLine("AF.name AS assembly_name, ");
|
||||
sql.AppendLine("AM.assembly_class, ");
|
||||
sql.AppendLine("AM.assembly_id, ");
|
||||
sql.AppendLine("AM.assembly_method, ");
|
||||
sql.AppendLine("ISNULL('[' + S3.Name + '].[' + object_name(D2.object_id) + ']','') AS DependOut, '[' + S2.Name + '].[' + object_name(D.referenced_major_id) + ']' AS TableName, D.referenced_major_id, OBJECTPROPERTY (P.object_id,'IsSchemaBound') AS IsSchemaBound, P.object_id, S.name as owner, P.name as name from sys.objects P ");
|
||||
sql.AppendLine("INNER JOIN sys.schemas S ON S.schema_id = P.schema_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.sql_dependencies D ON P.object_id = D.object_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.objects O ON O.object_id = D.referenced_major_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.schemas S2 ON S2.schema_id = O.schema_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.sql_dependencies D2 ON P.object_id = D2.referenced_major_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.objects O2 ON O2.object_id = D2.object_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.schemas S3 ON S3.schema_id = O2.schema_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.assembly_modules AM ON AM.object_id = P.object_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.assemblies AF ON AF.assembly_id = AM.assembly_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.parameters PP ON PP.object_id = AM.object_id AND PP.parameter_id = 0 and PP.is_output = 1 ");
|
||||
sql.AppendLine("LEFT JOIN sys.types T ON T.system_type_id = PP.system_type_id ");
|
||||
sql.AppendLine("WHERE P.type IN ('IF','FN','TF','FS') ORDER BY P.object_id");
|
||||
return sql.ToString();
|
||||
}
|
||||
|
||||
private static string GetAzure()
|
||||
{
|
||||
var sql = new StringBuilder();
|
||||
sql.AppendLine("SELECT DISTINCT ");
|
||||
sql.AppendLine("T.name AS ReturnType, PP.max_length, PP.precision, PP.Scale, ");
|
||||
sql.AppendLine("ISNULL(CONVERT(varchar,AM.execute_as_principal_id),'CALLER') as ExecuteAs, ");
|
||||
sql.AppendLine("P.type, ");
|
||||
sql.AppendLine("AF.name AS assembly_name, ");
|
||||
sql.AppendLine("AM.assembly_class, ");
|
||||
sql.AppendLine("AM.assembly_id, ");
|
||||
sql.AppendLine("AM.assembly_method, ");
|
||||
sql.AppendLine("ISNULL('[' + S3.Name + '].[' + object_name(D2.referencing_id) + ']','') AS DependOut, ");
|
||||
sql.AppendLine("'[' + S2.Name + '].[' + object_name(D.referenced_id) + ']' AS TableName, D.referenced_id AS referenced_major_id, OBJECTPROPERTY (P.object_id,'IsSchemaBound') AS IsSchemaBound, P.object_id, S.name as owner, P.name as name from sys.objects P ");
|
||||
sql.AppendLine("INNER JOIN sys.schemas S ON S.schema_id = P.schema_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.sql_expression_dependencies D ON P.object_id = D.referencing_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.objects O ON O.object_id = D.referenced_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.schemas S2 ON S2.schema_id = O.schema_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.sql_expression_dependencies D2 ON P.object_id = D2.referenced_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.objects O2 ON O2.object_id = D2.referencing_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.schemas S3 ON S3.schema_id = O2.schema_id ");
|
||||
sql.AppendLine("CROSS JOIN (SELECT null as object_id, null as execute_as_principal_id, null as assembly_class, null as assembly_id, null as assembly_method) AS AM ");
|
||||
sql.AppendLine("CROSS JOIN (SELECT null AS name) AS AF");
|
||||
sql.AppendLine("LEFT JOIN sys.parameters PP ON PP.object_id = AM.object_id AND PP.parameter_id = 0 and PP.is_output = 1 ");
|
||||
sql.AppendLine("LEFT JOIN sys.types T ON T.system_type_id = PP.system_type_id ");
|
||||
sql.AppendLine("WHERE P.type IN ('IF','FN','TF','FS') ORDER BY P.object_id");
|
||||
return sql.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
using System.Text;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands
|
||||
{
|
||||
internal static class IndexSQLCommand
|
||||
{
|
||||
public static string Get(DatabaseInfo.SQLServerVersion version, DatabaseInfo.SQLServerEdition edition)
|
||||
{
|
||||
switch (version)
|
||||
{
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2005:
|
||||
return Get2005();
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2008:
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2008R2:
|
||||
return Get2008();
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServerAzure10:
|
||||
return GetAzure();
|
||||
|
||||
default:
|
||||
if (edition == DatabaseInfo.SQLServerEdition.Azure)
|
||||
return GetAzure();
|
||||
else
|
||||
return Get2008();
|
||||
}
|
||||
}
|
||||
|
||||
private static string Get2005()
|
||||
{
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.Append("SELECT OO.type AS ObjectType, IC.key_ordinal, C.user_type_id, I.object_id, dsidx.Name as FileGroup, C.column_id,C.Name AS ColumnName, I.Name, I.index_id, I.type, is_unique, ignore_dup_key, is_primary_key, is_unique_constraint, fill_factor, is_padded, is_disabled, allow_row_locks, allow_page_locks, IC.is_descending_key, IC.is_included_column, ISNULL(ST.no_recompute,0) AS NoAutomaticRecomputation ");
|
||||
sql.Append("FROM sys.indexes I ");
|
||||
sql.Append("INNER JOIN sys.objects OO ON OO.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.index_columns IC ON IC.index_id = I.index_id AND IC.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.data_spaces AS dsidx ON dsidx.data_space_id = I.data_space_id ");
|
||||
sql.Append("INNER JOIN sys.columns C ON C.column_id = IC.column_id AND IC.object_id = C.object_id ");
|
||||
sql.Append("LEFT JOIN sys.stats AS ST ON ST.stats_id = I.index_id AND ST.object_id = I.object_id ");
|
||||
sql.Append("WHERE I.type IN (1,2,3) ");
|
||||
sql.Append("AND is_unique_constraint = 0 AND is_primary_key = 0 "); //AND I.object_id = " + table.Id.ToString(CultureInfo.InvariantCulture) + " ");
|
||||
sql.Append("AND objectproperty(I.object_id, 'IsMSShipped') <> 1 ");
|
||||
sql.Append("ORDER BY I.object_id, I.Name, IC.column_id");
|
||||
return sql.ToString();
|
||||
}
|
||||
|
||||
private static string Get2008()
|
||||
{
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.Append("SELECT ISNULL(I.filter_definition,'') AS FilterDefinition, OO.type AS ObjectType, IC.key_ordinal, C.user_type_id, I.object_id, dsidx.Name as FileGroup, C.column_id,C.Name AS ColumnName, I.Name, I.index_id, I.type, is_unique, ignore_dup_key, is_primary_key, is_unique_constraint, fill_factor, is_padded, is_disabled, allow_row_locks, allow_page_locks, IC.is_descending_key, IC.is_included_column, ISNULL(ST.no_recompute,0) AS NoAutomaticRecomputation ");
|
||||
sql.Append("FROM sys.indexes I ");
|
||||
sql.Append("INNER JOIN sys.objects OO ON OO.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.index_columns IC ON IC.index_id = I.index_id AND IC.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.data_spaces AS dsidx ON dsidx.data_space_id = I.data_space_id ");
|
||||
sql.Append("INNER JOIN sys.columns C ON C.column_id = IC.column_id AND IC.object_id = C.object_id ");
|
||||
sql.Append("LEFT JOIN sys.stats AS ST ON ST.stats_id = I.index_id AND ST.object_id = I.object_id ");
|
||||
sql.Append("WHERE I.type IN (1,2,3) ");
|
||||
sql.Append("AND is_unique_constraint = 0 AND is_primary_key = 0 "); //AND I.object_id = " + table.Id.ToString(CultureInfo.InvariantCulture) + " ");
|
||||
sql.Append("AND objectproperty(I.object_id, 'IsMSShipped') <> 1 ");
|
||||
sql.Append("ORDER BY I.object_id, I.Name, IC.column_id");
|
||||
return sql.ToString();
|
||||
}
|
||||
|
||||
private static string GetAzure()
|
||||
{
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.Append("SELECT ISNULL(I.filter_definition,'') AS FilterDefinition, OO.type AS ObjectType, IC.key_ordinal, C.user_type_id, I.object_id, '' as FileGroup, C.column_id,C.Name AS ColumnName, I.Name, I.index_id, I.type, is_unique, ignore_dup_key, is_primary_key, is_unique_constraint, fill_factor, is_padded, is_disabled, allow_row_locks, allow_page_locks, IC.is_descending_key, IC.is_included_column, ISNULL(ST.no_recompute,0) AS NoAutomaticRecomputation ");
|
||||
sql.Append("FROM sys.indexes I ");
|
||||
sql.Append("INNER JOIN sys.objects OO ON OO.object_id = I.object_id ");
|
||||
sql.Append("INNER JOIN sys.index_columns IC ON IC.index_id = I.index_id AND IC.object_id = I.object_id ");
|
||||
//sql.Append("INNER JOIN sys.data_spaces AS dsidx ON dsidx.data_space_id = I.data_space_id ");
|
||||
sql.Append("INNER JOIN sys.columns C ON C.column_id = IC.column_id AND IC.object_id = C.object_id ");
|
||||
sql.Append("LEFT JOIN sys.stats AS ST ON ST.stats_id = I.index_id AND ST.object_id = I.object_id ");
|
||||
sql.Append("WHERE I.type IN (1,2,3) ");
|
||||
sql.Append("AND is_unique_constraint = 0 AND is_primary_key = 0 "); //AND I.object_id = " + table.Id.ToString(CultureInfo.InvariantCulture) + " ");
|
||||
sql.Append("AND objectproperty(I.object_id, 'IsMSShipped') <> 1 ");
|
||||
sql.Append("ORDER BY I.object_id, I.Name, IC.column_id");
|
||||
return sql.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
using System.Text;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands
|
||||
{
|
||||
internal static class TableSQLCommand
|
||||
{
|
||||
#region Table Count
|
||||
|
||||
public static string GetTableCount(DatabaseInfo.SQLServerVersion version, DatabaseInfo.SQLServerEdition edition)
|
||||
{
|
||||
switch (version)
|
||||
{
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2000:
|
||||
return GetTableCount2000();
|
||||
|
||||
default:
|
||||
return GetTableCount2005();
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetTableCount2000()
|
||||
{
|
||||
return "SELECT Count(*) FROM sysobjects SO WHERE type = 'U'";
|
||||
}
|
||||
|
||||
private static string GetTableCount2005()
|
||||
{
|
||||
return "SELECT Count(*) from sys.tables";
|
||||
}
|
||||
|
||||
#endregion Table Count
|
||||
|
||||
#region Table Detail
|
||||
|
||||
public static string GetTableDetail(DatabaseInfo.SQLServerVersion version, DatabaseInfo.SQLServerEdition edition)
|
||||
{
|
||||
switch (version)
|
||||
{
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2000:
|
||||
return GetTableDetail2000();
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2005:
|
||||
return GetTableDetail2005();
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2008:
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2008R2:
|
||||
return GetTableDetail2008();
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServerAzure10:
|
||||
return GetTableDetailAzure();
|
||||
|
||||
default:
|
||||
if (edition == DatabaseInfo.SQLServerEdition.Azure)
|
||||
return GetTableDetailAzure();
|
||||
else
|
||||
return GetTableDetail2008();
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetTableDetailAzure()
|
||||
{
|
||||
var sql = new StringBuilder();
|
||||
sql.AppendLine("SELECT DISTINCT 0 AS HasChangeTrackingTrackColumn, 0 AS HasChangeTracking, TTT.lock_escalation_desc, T.type AS ObjectType, C.Name, C.is_filestream, C.is_sparse, S4.Name as OwnerType,C.user_type_id, C.Column_Id AS ID, C.max_length AS Size, C.Precision, C.Scale, ISNULL(C.Collation_Name,'') as Collation, C.Is_nullable AS IsNullable, C.Is_RowGuidcol AS IsRowGuid, C.Is_Computed AS IsComputed, C.Is_Identity AS IsIdentity, COLUMNPROPERTY(T.object_id,C.name,'IsIdNotForRepl') AS IsIdentityRepl,IDENT_SEED('[' + S1.name + '].[' + T.Name + ']') AS IdentSeed, IDENT_INCR('[' + S1.name + '].[' + T.Name + ']') AS IdentIncrement, ISNULL(CC.Definition,'') AS Formula, ISNULL(CC.Is_Persisted,0) AS FormulaPersisted, ");
|
||||
sql.AppendLine("CASE WHEN ISNULL(DEP.referencing_minor_id,0) = 0 THEN 0 ELSE 1 END AS HasComputedFormula, CASE WHEN ISNULL(IC.column_id,0) = 0 THEN 0 ELSE 1 END AS HasIndex, TY.Name AS Type, '[' + S3.Name + '].' + XSC.Name AS XMLSchema, C.Is_xml_document, TY.is_user_defined, ");
|
||||
sql.AppendLine("ISNULL(TT.Name,T.Name) AS TableName, T.object_id AS TableId,S1.name AS TableOwner,Text_In_Row_limit, large_value_types_out_of_row,ISNULL(objectproperty(T.object_id, N'TableHasVarDecimalStorageFormat'),0) AS HasVarDecimal,OBJECTPROPERTY(T.OBJECT_ID,'TableHasClustIndex') AS HasClusteredIndex, ");
|
||||
sql.AppendLine(" '' AS FileGroup, '' AS FileGroupText, '' AS FileGroupStream,ISNULL(DC.object_id,0) AS DefaultId, DC.name AS DefaultName, DC.definition AS DefaultDefinition, C.rule_object_id, C.default_object_id ");
|
||||
sql.AppendLine("FROM sys.columns C ");
|
||||
sql.AppendLine("INNER JOIN sys.objects T ON T.object_id = C.object_id ");
|
||||
sql.AppendLine("INNER JOIN sys.types TY ON TY.user_type_id = C.user_type_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.indexes IDX ON IDX.object_id = T.object_id and IDX.index_id < 2 ");
|
||||
//sql.Append("LEFT JOIN sys.data_spaces AS DSIDX ON DSIDX.data_space_id = IDX.data_space_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.table_types TT ON TT.type_table_object_id = C.object_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.tables TTT ON TTT.object_id = C.object_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.schemas S1 ON (S1.schema_id = TTT.schema_id and T.type = 'U') OR (S1.schema_id = TT.schema_id and T.type = 'TT')");
|
||||
sql.AppendLine("LEFT JOIN sys.xml_schema_collections XSC ON XSC.xml_collection_id = C.xml_collection_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.schemas S3 ON S3.schema_id = XSC.schema_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.schemas S4 ON S4.schema_id = TY.schema_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.computed_columns CC ON CC.column_id = C.column_Id AND C.object_id = CC.object_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.sql_expression_dependencies DEP ON DEP.referenced_id = C.object_id AND DEP.referenced_minor_id = C.column_Id AND DEP.referencing_id = C.object_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.index_columns IC ON IC.object_id = T.object_id AND IC.column_Id = C.column_Id ");
|
||||
//sql.Append("LEFT JOIN sys.data_spaces AS lob ON lob.data_space_id = TTT.lob_data_space_id ");
|
||||
//sql.Append("LEFT JOIN sys.data_spaces AS filestr ON filestr.data_space_id = TTT.filestream_data_space_id ");
|
||||
sql.AppendLine("LEFT JOIN sys.default_constraints DC ON DC.parent_object_id = T.object_id AND parent_column_id = C.Column_Id ");
|
||||
//sql.Append("LEFT JOIN sys.change_tracking_tables CTT ON CTT.object_id = T.object_id ");
|
||||
sql.AppendLine("WHERE T.type IN ('U','TT') ");
|
||||
sql.AppendLine("ORDER BY ISNULL(TT.Name,T.Name),T.object_id,C.column_id");
|
||||
return sql.ToString();
|
||||
}
|
||||
|
||||
private static string GetTableDetail2008()
|
||||
{
|
||||
string sql = "";
|
||||
sql += "SELECT DISTINCT (CASE WHEN ISNULL(CTT.is_track_columns_updated_on,0) <> 0 THEN is_track_columns_updated_on ELSE 0 END) AS HasChangeTrackingTrackColumn, (CASE WHEN ISNULL(CTT.object_id,0) <> 0 THEN 1 ELSE 0 END) AS HasChangeTracking, TTT.lock_escalation_desc, T.type AS ObjectType, C.Name, C.is_filestream, C.is_sparse, S4.Name as OwnerType,C.user_type_id, C.Column_Id AS ID, C.max_length AS Size, C.Precision, C.Scale, ISNULL(C.Collation_Name,'') as Collation, C.Is_nullable AS IsNullable, C.Is_RowGuidcol AS IsRowGuid, C.Is_Computed AS IsComputed, C.Is_Identity AS IsIdentity, COLUMNPROPERTY(T.object_id,C.name,'IsIdNotForRepl') AS IsIdentityRepl,IDENT_SEED('[' + S1.name + '].[' + T.Name + ']') AS IdentSeed, IDENT_INCR('[' + S1.name + '].[' + T.Name + ']') AS IdentIncrement, ISNULL(CC.Definition,'') AS Formula, ISNULL(CC.Is_Persisted,0) AS FormulaPersisted, CASE WHEN ISNULL(DEP.column_id,0) = 0 THEN 0 ELSE 1 END AS HasComputedFormula, CASE WHEN ISNULL(IC.column_id,0) = 0 THEN 0 ELSE 1 END AS HasIndex, TY.Name AS Type, '[' + S3.Name + '].' + XSC.Name AS XMLSchema, C.Is_xml_document, TY.is_user_defined, ISNULL(TT.Name,T.Name) AS TableName, T.object_id AS TableId,S1.name AS TableOwner,Text_In_Row_limit, large_value_types_out_of_row,ISNULL(objectproperty(T.object_id, N'TableHasVarDecimalStorageFormat'),0) AS HasVarDecimal,OBJECTPROPERTY(T.OBJECT_ID,'TableHasClustIndex') AS HasClusteredIndex,DSIDX.Name AS FileGroup,ISNULL(lob.Name,'') AS FileGroupText, ISNULL(filestr.Name,'') AS FileGroupStream,ISNULL(DC.object_id,0) AS DefaultId, DC.name AS DefaultName, DC.definition AS DefaultDefinition, C.rule_object_id, C.default_object_id ";
|
||||
sql += "FROM sys.columns C ";
|
||||
sql += "INNER JOIN sys.objects T ON T.object_id = C.object_id ";
|
||||
sql += "INNER JOIN sys.types TY ON TY.user_type_id = C.user_type_id ";
|
||||
sql += "LEFT JOIN sys.indexes IDX ON IDX.object_id = T.object_id and IDX.index_id < 2 ";
|
||||
sql += "LEFT JOIN sys.data_spaces AS DSIDX ON DSIDX.data_space_id = IDX.data_space_id ";
|
||||
sql += "LEFT JOIN sys.table_types TT ON TT.type_table_object_id = C.object_id ";
|
||||
sql += "LEFT JOIN sys.tables TTT ON TTT.object_id = C.object_id ";
|
||||
sql += "LEFT JOIN sys.schemas S1 ON (S1.schema_id = TTT.schema_id and T.type = 'U') OR (S1.schema_id = TT.schema_id and T.type = 'TT')";
|
||||
sql += "LEFT JOIN sys.xml_schema_collections XSC ON XSC.xml_collection_id = C.xml_collection_id ";
|
||||
sql += "LEFT JOIN sys.schemas S3 ON S3.schema_id = XSC.schema_id ";
|
||||
sql += "LEFT JOIN sys.schemas S4 ON S4.schema_id = TY.schema_id ";
|
||||
sql += "LEFT JOIN sys.computed_columns CC ON CC.column_id = C.column_Id AND C.object_id = CC.object_id ";
|
||||
sql += "LEFT JOIN sys.sql_dependencies DEP ON DEP.referenced_major_id = C.object_id AND DEP.referenced_minor_id = C.column_Id AND DEP.object_id = C.object_id ";
|
||||
sql += "LEFT JOIN sys.index_columns IC ON IC.object_id = T.object_id AND IC.column_Id = C.column_Id ";
|
||||
sql += "LEFT JOIN sys.data_spaces AS lob ON lob.data_space_id = TTT.lob_data_space_id ";
|
||||
sql += "LEFT JOIN sys.data_spaces AS filestr ON filestr.data_space_id = TTT.filestream_data_space_id ";
|
||||
sql += "LEFT JOIN sys.default_constraints DC ON DC.parent_object_id = T.object_id AND parent_column_id = C.Column_Id ";
|
||||
sql += "LEFT JOIN sys.change_tracking_tables CTT ON CTT.object_id = T.object_id ";
|
||||
sql += "WHERE T.type IN ('U','TT') ";
|
||||
sql += "ORDER BY ISNULL(TT.Name,T.Name),T.object_id,C.column_id";
|
||||
return sql;
|
||||
}
|
||||
|
||||
private static string GetTableDetail2005()
|
||||
{
|
||||
string sql = "";
|
||||
sql += "SELECT DISTINCT T.type AS ObjectType, C.Name, S4.Name as OwnerType,";
|
||||
sql += "C.user_type_id, C.Column_Id AS ID, C.max_length AS Size, C.Precision, C.Scale, ISNULL(C.Collation_Name,'') as Collation, C.Is_nullable AS IsNullable, C.Is_RowGuidcol AS IsRowGuid, C.Is_Computed AS IsComputed, C.Is_Identity AS IsIdentity, COLUMNPROPERTY(T.object_id,C.name,'IsIdNotForRepl') AS IsIdentityRepl,IDENT_SEED('[' + S1.name + '].[' + T.Name + ']') AS IdentSeed, IDENT_INCR('[' + S1.name + '].[' + T.Name + ']') AS IdentIncrement, ISNULL(CC.Definition,'') AS Formula, ISNULL(CC.Is_Persisted,0) AS FormulaPersisted, CASE WHEN ISNULL(DEP.column_id,0) = 0 THEN 0 ELSE 1 END AS HasComputedFormula, CASE WHEN ISNULL(IC.column_id,0) = 0 THEN 0 ELSE 1 END AS HasIndex, TY.Name AS Type, '[' + S3.Name + '].' + XSC.Name AS XMLSchema, C.Is_xml_document, TY.is_user_defined, ";
|
||||
sql += "T.Name AS TableName, T.object_id AS TableId,S1.name AS TableOwner,Text_In_Row_limit, large_value_types_out_of_row,ISNULL(objectproperty(T.object_id, N'TableHasVarDecimalStorageFormat'),0) AS HasVarDecimal,OBJECTPROPERTY(T.OBJECT_ID,'TableHasClustIndex') AS HasClusteredIndex,DSIDX.Name AS FileGroup,ISNULL(LOB.Name,'') AS FileGroupText, ";
|
||||
sql += "ISNULL(DC.object_id,0) AS DefaultId, DC.name AS DefaultName, DC.definition AS DefaultDefinition, C.rule_object_id, C.default_object_id ";
|
||||
sql += "FROM sys.columns C ";
|
||||
sql += "INNER JOIN sys.tables T ON T.object_id = C.object_id ";
|
||||
sql += "INNER JOIN sys.types TY ON TY.user_type_id = C.user_type_id ";
|
||||
sql += "INNER JOIN sys.schemas S1 ON S1.schema_id = T.schema_id ";
|
||||
sql += "INNER JOIN sys.indexes IDX ON IDX.object_id = T.object_id and IDX.index_id < 2 ";
|
||||
sql += "INNER JOIN sys.data_spaces AS DSIDX ON DSIDX.data_space_id = IDX.data_space_id ";
|
||||
sql += "LEFT JOIN sys.xml_schema_collections XSC ON XSC.xml_collection_id = C.xml_collection_id ";
|
||||
sql += "LEFT JOIN sys.schemas S3 ON S3.schema_id = XSC.schema_id ";
|
||||
sql += "LEFT JOIN sys.schemas S4 ON S4.schema_id = TY.schema_id ";
|
||||
sql += "LEFT JOIN sys.computed_columns CC ON CC.column_id = C.column_Id AND C.object_id = CC.object_id ";
|
||||
sql += "LEFT JOIN sys.sql_dependencies DEP ON DEP.referenced_major_id = C.object_id AND DEP.referenced_minor_id = C.column_Id AND DEP.object_id = C.object_id ";
|
||||
sql += "LEFT JOIN sys.index_columns IC ON IC.object_id = T.object_id AND IC.column_Id = C.column_Id ";
|
||||
sql += "LEFT JOIN sys.data_spaces AS LOB ON LOB.data_space_id = T.lob_data_space_id ";
|
||||
sql += "LEFT JOIN sys.default_constraints DC ON DC.parent_object_id = T.object_id AND parent_column_id = C.Column_Id ";
|
||||
sql += "ORDER BY T.Name,T.object_id,C.column_id";
|
||||
return sql;
|
||||
}
|
||||
|
||||
private static string GetTableDetail2000()
|
||||
{
|
||||
string sql = "";
|
||||
sql += "SELECT SO.name, ";
|
||||
sql += "SO.id as object_id, ";
|
||||
sql += "SU.name as Owner, ";
|
||||
sql += "OBJECTPROPERTY(SO.ID,'TableTextInRowLimit') AS Text_In_Row_limit,";
|
||||
sql += "0 AS HasVarDecimal, ";
|
||||
sql += "CONVERT(bit,0) AS large_value_types_out_of_row, ";
|
||||
sql += "F.groupname AS FileGroup, ";
|
||||
sql += "ISNULL(F2.groupname,'') AS FileGroupText, ";
|
||||
sql += "OBJECTPROPERTY(SO.ID,'TableHasClustIndex') AS HasClusteredIndex ";
|
||||
sql += "FROM sysobjects SO ";
|
||||
sql += "inner join sysindexes I ON I.id = SO.id and I.indid < 2 ";
|
||||
sql += "inner join sysfilegroups f on f.groupid = i.groupid ";
|
||||
sql += "left join sysindexes I2 ON I2.id = SO.id and I2.indid = 255 ";
|
||||
sql += "left join sysfilegroups f2 on f2.groupid = i2.groupid ";
|
||||
sql += "INNER JOIN sysusers SU ON SU.uid = SO.uid WHERE type = 'U' ORDER BY SO.name";
|
||||
return sql;
|
||||
}
|
||||
|
||||
#endregion Table Detail
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands
|
||||
{
|
||||
internal static class UserDataTypeCommand
|
||||
{
|
||||
public static string Get(DatabaseInfo.SQLServerVersion version, DatabaseInfo.SQLServerEdition edition)
|
||||
{
|
||||
switch (version)
|
||||
{
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2000:
|
||||
return Get2000();
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2005:
|
||||
return Get2005();
|
||||
|
||||
default:
|
||||
return Get2008();
|
||||
}
|
||||
}
|
||||
|
||||
public static string Get2008()
|
||||
{
|
||||
string sql = "SELECT ISNULL(AF.name,'') AS assembly_name, ISNULL(AT.assembly_id,0) AS assembly_id, ISNULL(assembly_class,'') AS assembly_class, T.max_length, S2.name as defaultowner, O2.name as defaultname, S1.name as ruleowner, O.name as rulename, ISNULL(T2.Name,'') AS basetypename, S.Name AS Owner, T.Name, T.is_assembly_type, T.user_type_id AS tid, T.is_nullable, T.precision, T.scale ";
|
||||
sql += "FROM sys.types T ";
|
||||
sql += "INNER JOIN sys.schemas S ON S.schema_id = T.schema_id ";
|
||||
sql += "LEFT JOIN sys.types T2 ON T2.user_type_id = T.system_type_id ";
|
||||
sql += "LEFT JOIN sys.objects O ON O.type = 'R' and O.object_id = T.rule_object_id ";
|
||||
sql += "LEFT JOIN sys.schemas S1 ON S1.schema_id = O.schema_id ";
|
||||
sql += "LEFT JOIN sys.objects O2 ON O2.type = 'D' and O2.object_id = T.default_object_id ";
|
||||
sql += "LEFT JOIN sys.schemas S2 ON S2.schema_id = O2.schema_id ";
|
||||
sql += "LEFT JOIN sys.assembly_types AT ON AT.user_type_id = T.user_type_id AND T.is_assembly_type = 1 ";
|
||||
sql += "LEFT JOIN sys.assemblies AF ON AF.assembly_id = AT.assembly_id ";
|
||||
sql += "WHERE T.is_user_defined = 1 AND T.is_table_type = 0 ORDER BY T.Name";
|
||||
return sql;
|
||||
}
|
||||
|
||||
public static string Get2005()
|
||||
{
|
||||
string sql = "select ISNULL(AF.name,'') AS assembly_name, ISNULL(AT.assembly_id,0) AS assembly_id, ISNULL(assembly_class,'') AS assembly_class, T.max_length, S2.name as defaultowner, O2.name as defaultname, S1.name as ruleowner, O.name as rulename, ISNULL(T2.Name,'') AS basetypename, S.Name AS Owner, T.Name, T.is_assembly_type, T.user_type_id AS tid, T.is_nullable, T.precision, T.scale from sys.types T ";
|
||||
sql += "INNER JOIN sys.schemas S ON S.schema_id = T.schema_id ";
|
||||
sql += "LEFT JOIN sys.types T2 ON T2.user_type_id = T.system_type_id ";
|
||||
sql += "LEFT JOIN sys.objects O ON O.type = 'R' and O.object_id = T.rule_object_id ";
|
||||
sql += "LEFT JOIN sys.schemas S1 ON S1.schema_id = O.schema_id ";
|
||||
sql += "LEFT JOIN sys.objects O2 ON O2.type = 'D' and O2.object_id = T.default_object_id ";
|
||||
sql += "LEFT JOIN sys.schemas S2 ON S2.schema_id = O2.schema_id ";
|
||||
sql += "LEFT JOIN sys.assembly_types AT ON AT.user_type_id = T.user_type_id AND T.is_assembly_type = 1 ";
|
||||
sql += "LEFT JOIN sys.assemblies AF ON AF.assembly_id = AT.assembly_id ";
|
||||
sql += "WHERE T.is_user_defined = 1 ORDER BY T.Name";
|
||||
return sql;
|
||||
}
|
||||
|
||||
public static string Get2000()
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
using System.Text;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands
|
||||
{
|
||||
internal static class UserSQLCommand
|
||||
{
|
||||
public static string Get(DatabaseInfo.SQLServerVersion version, DatabaseInfo.SQLServerEdition edition)
|
||||
{
|
||||
switch (version)
|
||||
{
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2000:
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2005:
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2008:
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2008R2:
|
||||
return Get2008();
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServerAzure10:
|
||||
return GetAzure();
|
||||
|
||||
default:
|
||||
if (edition == DatabaseInfo.SQLServerEdition.Azure)
|
||||
return GetAzure();
|
||||
else
|
||||
return Get2008();
|
||||
}
|
||||
}
|
||||
|
||||
private static string Get2008()
|
||||
{
|
||||
var sql = new StringBuilder();
|
||||
sql.AppendLine("SELECT is_fixed_role, type, ISNULL(suser_sname(sid),'') AS Login,Name,principal_id, ISNULL(default_schema_name,'') AS default_schema_name ");
|
||||
sql.AppendLine("FROM sys.database_principals ");
|
||||
sql.AppendLine("WHERE type IN ('S','U','A','R') ");
|
||||
sql.AppendLine("ORDER BY Name");
|
||||
return sql.ToString();
|
||||
}
|
||||
|
||||
private static string GetAzure()
|
||||
{
|
||||
var sql = new StringBuilder();
|
||||
//to get LoginName in Azure (asside for the current login) you would have to link to master and query sys.sysusers or sys.sql_users
|
||||
//the CASE test below will at least get you the Current login
|
||||
sql.AppendLine("SELECT is_fixed_role, type, CASE WHEN suser_sid()=sid THEN suser_sname() ELSE '' END AS Login,Name,principal_id, ISNULL(default_schema_name,'') AS default_schema_name ");
|
||||
sql.AppendLine("FROM sys.database_principals ");
|
||||
sql.AppendLine("WHERE type IN ('S','U','A','R') ");
|
||||
sql.AppendLine("ORDER BY Name");
|
||||
return sql.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
||||
using System.Text;
|
||||
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands
|
||||
{
|
||||
internal static class ViewSQLCommand
|
||||
{
|
||||
#region View
|
||||
|
||||
public static string GetView(DatabaseInfo.SQLServerVersion version, DatabaseInfo.SQLServerEdition edition)
|
||||
{
|
||||
switch (version)
|
||||
{
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2000:
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2005:
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2008:
|
||||
case DatabaseInfo.SQLServerVersion.SQLServer2008R2:
|
||||
return GetViewSql2008();
|
||||
|
||||
case DatabaseInfo.SQLServerVersion.SQLServerAzure10:
|
||||
return GetViewSqlAzure();
|
||||
|
||||
default:
|
||||
if (edition == DatabaseInfo.SQLServerEdition.Azure)
|
||||
return GetViewSqlAzure();
|
||||
else
|
||||
return GetViewSql2008();
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetViewSql2008()
|
||||
{
|
||||
string sql = "";
|
||||
sql += "select distinct ISNULL('[' + S3.Name + '].[' + object_name(D2.object_id) + ']','') AS DependOut, '[' + S2.Name + '].[' + object_name(D.referenced_major_id) + ']' AS TableName, D.referenced_major_id, OBJECTPROPERTY (P.object_id,'IsSchemaBound') AS IsSchemaBound, P.object_id, S.name as owner, P.name as name from sys.views P ";
|
||||
sql += "INNER JOIN sys.schemas S ON S.schema_id = P.schema_id ";
|
||||
sql += "LEFT JOIN sys.sql_dependencies D ON P.object_id = D.object_id ";
|
||||
sql += "LEFT JOIN sys.objects O ON O.object_id = D.referenced_major_id ";
|
||||
sql += "LEFT JOIN sys.schemas S2 ON S2.schema_id = O.schema_id ";
|
||||
sql += "LEFT JOIN sys.sql_dependencies D2 ON P.object_id = D2.referenced_major_id ";
|
||||
sql += "LEFT JOIN sys.objects O2 ON O2.object_id = D2.object_id ";
|
||||
sql += "LEFT JOIN sys.schemas S3 ON S3.schema_id = O2.schema_id ";
|
||||
sql += "ORDER BY P.object_id";
|
||||
return sql;
|
||||
}
|
||||
|
||||
private static string GetViewSqlAzure()
|
||||
{
|
||||
var sql = new StringBuilder();
|
||||
//Avoid using sql_dependencies. Use sys.sql_expression_dependencies instead. http://msdn.microsoft.com/en-us/library/ms174402.aspx
|
||||
sql.Append("SELECT DISTINCT ISNULL('[' + S3.Name + '].[' + object_name(D2.referencing_id) + ']','') AS DependOut, ");
|
||||
sql.Append("'[' + S2.Name + '].[' + object_name(D.referenced_id) + ']' AS TableName, ");
|
||||
sql.Append("D.referenced_id AS referenced_major_id, OBJECTPROPERTY (P.object_id,'IsSchemaBound') AS IsSchemaBound, ");
|
||||
sql.Append("P.object_id, S.name as owner, P.name as name ");
|
||||
sql.Append("FROM sys.views P ");
|
||||
sql.Append("INNER JOIN sys.schemas S ON S.schema_id = P.schema_id ");
|
||||
sql.Append("LEFT JOIN sys.sql_expression_dependencies D ON P.object_id = D.referencing_id ");
|
||||
sql.Append("LEFT JOIN sys.objects O ON O.object_id = D.referenced_id ");
|
||||
sql.Append("LEFT JOIN sys.schemas S2 ON S2.schema_id = O.schema_id ");
|
||||
sql.Append("LEFT JOIN sys.sql_expression_dependencies D2 ON P.object_id = D2.referenced_id ");
|
||||
sql.Append("LEFT JOIN sys.objects O2 ON O2.object_id = D2.referencing_id ");
|
||||
sql.Append("LEFT JOIN sys.schemas S3 ON S3.schema_id = O2.schema_id ");
|
||||
sql.Append("ORDER BY P.object_id ");
|
||||
return sql.ToString();
|
||||
}
|
||||
|
||||
#endregion View
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates.Util
|
||||
{
|
||||
/// <summary>
|
||||
/// This class implements a fast conversion from a byte array to an hex string.
|
||||
/// </summary>
|
||||
public class ByteToHexEncoder
|
||||
{
|
||||
private static readonly uint[] _lookup32 = CreateLookup32();
|
||||
|
||||
private static uint[] CreateLookup32()
|
||||
{
|
||||
var result = new uint[256];
|
||||
for (int i = 0; i < 256; i++)
|
||||
{
|
||||
var s = i.ToString("X2");
|
||||
result[i] = ((uint)s[0]) + ((uint)s[1] << 16);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static string ByteArrayToHex(byte[] bytes)
|
||||
{
|
||||
var result = new char[2 + bytes.Length * 2];
|
||||
|
||||
result[0] = '0';
|
||||
result[1] = 'x';
|
||||
|
||||
for (int i = 0; i < bytes.Length; i++)
|
||||
{
|
||||
var val = _lookup32[bytes[i]];
|
||||
result[2 * i + 2] = (char)val;
|
||||
result[2 * i + 3] = (char)(val >> 16);
|
||||
}
|
||||
|
||||
return new string(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates.Util
|
||||
{
|
||||
internal class Constants
|
||||
{
|
||||
public const int READING_RULES = 0;
|
||||
public const int READING_TABLES = 1;
|
||||
public const int READING_CONSTRAINTS = 2;
|
||||
public const int READING_UDT = 3;
|
||||
public const int READING_XMLSCHEMAS = 4;
|
||||
public const int READING_SCHEMAS = 5;
|
||||
public const int READING_USER = 6;
|
||||
public const int READING_PARTITIONFUNCTION = 7;
|
||||
public const int READING_PARTITIONSCHEME = 8;
|
||||
public const int READING_FILEGROUPS = 9;
|
||||
public const int READING_DLLTRIGGERS = 10;
|
||||
public const int READING_SYNONYMS = 11;
|
||||
public const int READING_ASSEMBLIES = 12;
|
||||
public const int READING_PROCEDURES = 13;
|
||||
public const int READING_VIEWS = 14;
|
||||
public const int READING_FUNCTIONS = 15;
|
||||
public const int READING_INDEXES = 16;
|
||||
public const int READING_TRIGGERS = 17;
|
||||
public const int READING_TEXTOBJECTS = 18;
|
||||
public const int READING_EXTENDED_PROPERTIES = 19;
|
||||
public const int READING_MAX = 20;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates.Util
|
||||
{
|
||||
internal static class ConvertType
|
||||
{
|
||||
public static ObjectType GetObjectType(string type)
|
||||
{
|
||||
if (type.Trim().Equals("V")) return ObjectType.View;
|
||||
if (type.Trim().Equals("U")) return ObjectType.Table;
|
||||
if (type.Trim().Equals("FN")) return ObjectType.Function;
|
||||
if (type.Trim().Equals("TF")) return ObjectType.Function;
|
||||
if (type.Trim().Equals("IF")) return ObjectType.Function;
|
||||
if (type.Trim().Equals("P")) return ObjectType.StoredProcedure;
|
||||
if (type.Trim().Equals("TR")) return ObjectType.Trigger;
|
||||
return ObjectType.None;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user