Guest User

Untitled

a guest
Feb 20th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.13 KB | None | 0 0
  1. public static class SqlHelper
  2. {
  3. private const string ForeignKeyColumnsQuery = @"
  4. SELECT
  5. obj.name AS [fk_name],
  6. fk_schema.name AS [fk_schema],
  7. fk_table.name AS [fk_table],
  8. fk_column.name AS [fk_column],
  9. pk_schema.name AS [pk_schema],
  10. pk_table.name AS [pk_table],
  11. pk_column.name AS [pk_column]
  12. FROM
  13. sys.foreign_key_columns fkc
  14. INNER JOIN sys.objects obj ON obj.object_id = fkc.constraint_object_id
  15.  
  16. INNER JOIN sys.tables fk_table ON fk_table.object_id = fkc.parent_object_id
  17. INNER JOIN sys.schemas fk_schema ON fk_table.schema_id = fk_schema.schema_id
  18. INNER JOIN sys.columns fk_column ON fk_column.column_id = parent_column_id AND fk_column.object_id = fk_table.object_id
  19.  
  20. INNER JOIN sys.tables pk_table ON pk_table.object_id = fkc.referenced_object_id
  21. INNER JOIN sys.schemas pk_schema ON pk_table.schema_id = pk_schema.schema_id
  22. INNER JOIN sys.columns pk_column ON pk_column.column_id = referenced_column_id AND pk_column.object_id = pk_table.object_id
  23. ";
  24.  
  25. public static IList<AlterTableConstraint> GetAlterTableConstraints(this SqlConnection connection, Func<ConstraintInfo, bool> predicate = null)
  26. {
  27. return
  28. connection
  29. .Query<ConstraintInfo>(ForeignKeyColumnsQuery)
  30. .Where((predicate ?? (_ => true)))
  31. .GroupBy(x => x.fk_name)
  32. .Select(AlterTableConstraint.Create)
  33. .ToList();
  34. }
  35.  
  36. }
  37.  
  38. public class AlterTableConstraint : IGrouping<string, ConstraintInfo>
  39. {
  40. private readonly IEnumerable<ConstraintInfo> _contraintInfos;
  41.  
  42. private AlterTableConstraint(IGrouping<string, ConstraintInfo> cig)
  43. {
  44. Key = cig.Key;
  45. _contraintInfos = cig;
  46.  
  47. var ci = cig.First();
  48.  
  49. var fk_table = $"[{ci.fk_schema}].[{ci.fk_table}]";
  50. var pk_table = $"[{ci.pk_schema}].[{ci.pk_table}]";
  51.  
  52. var constraint = $"[{ci.fk_name}]";
  53. var fk = string.Join(", ", cig.Select(x => $"[{x.fk_column}]"));
  54. var pk = string.Join(", ", cig.Select(x => $"[{x.pk_column}]"));
  55.  
  56. Drop = $"ALTER TABLE {fk_table} DROP CONSTRAINT {constraint}";
  57. Add = $"ALTER TABLE {fk_table} WITH CHECK ADD CONSTRAINT {constraint} FOREIGN KEY({fk}) REFERENCES {pk_table}({pk})";
  58. Check = $"ALTER TABLE {fk_table} CHECK CONSTRAINT {constraint}";
  59. }
  60.  
  61. public string Key { get; }
  62.  
  63. public string Drop { get; }
  64. public string Add { get; }
  65. public string Check { get; }
  66.  
  67. // LINQPad
  68. private object ToDump()
  69. {
  70. return new
  71. {
  72. Key,
  73. Drop,
  74. Add,
  75. Check
  76. };
  77. }
  78.  
  79. public static AlterTableConstraint Create(IGrouping<string, ConstraintInfo> cig)
  80. {
  81. return new AlterTableConstraint(cig);
  82. }
  83.  
  84. public IEnumerator<ConstraintInfo> GetEnumerator()
  85. {
  86. return _contraintInfos.GetEnumerator();
  87. }
  88.  
  89. IEnumerator IEnumerable.GetEnumerator()
  90. {
  91. return GetEnumerator();
  92. }
  93. }
  94.  
  95. public class ConstraintInfo
  96. {
  97. // Using sql naming convention here to avoid mapping.
  98.  
  99. public string fk_name { get; set; }
  100.  
  101. public string fk_schema { get; set; }
  102. public string fk_table { get; set; }
  103. public string fk_column { get; set; }
  104.  
  105. public string fk_full => $"[{fk_schema}].[{fk_table}].[{fk_column}]";
  106.  
  107. public string pk_schema { get; set; }
  108. public string pk_table { get; set; }
  109. public string pk_column { get; set; }
  110.  
  111. public string pk_full => $"[{pk_schema}].[{pk_table}].[{pk_column}]";
  112. }
  113.  
  114. SqlHelper.Execute(ConnectonString, connection =>
  115. {
  116. var tableNames = new[] { "TimeRange", "Message" };
  117. var alterTables = connection.GetAlterTableConstraints(ci => tableNames.Contains(ci.fk_table, StringComparer.OrdinalIgnoreCase));
  118.  
  119. foreach (var alterTable in alterTables)
  120. {
  121. connection.ExecuteNonQuery(alterTable.Drop);
  122. }
  123.  
  124. connection.Seed(new SqlFourPartName("Message") { SchemaName = "smq" }, messages);
  125. connection.Seed(new SqlFourPartName("TimeRange") { SchemaName = "smq" }, timeRanges);
  126.  
  127. foreach (var alterTable in alterTables)
  128. {
  129. connection.ExecuteNonQuery(alterTable.Add);
  130. connection.ExecuteNonQuery(alterTable.Check);
  131. }
  132. });
Add Comment
Please, Sign In to add comment