当前位置:Gxlcms > mysql > SQLSERVER数据库管理员的专用连接DAC

SQLSERVER数据库管理员的专用连接DAC

时间:2021-07-01 10:21:17 帮助过:40人阅读

SQLSERVER数据库管理员的专用连接DAC DAC: Dedicated Admin Connection 当 SQL Server 因系统资源不足,或其它异常导致无法建立数据库连接时, 可以使用系统预留的 DAC 连接到数据库,进行一些问题诊断和故障排除。DAC只能使用有限的资源。请勿使用DAC运行

SQLSERVER数据库管理员的专用连接DAC

DAC:Dedicated Admin Connection

SQL Server因系统资源不足,或其它异常导致无法建立数据库连接时, 可以使用系统预留的DAC连接到数据库,进行一些问题诊断和故障排除。DAC只能使用有限的资源。请勿使用DAC运行需要消耗大量资源的查询,否则可能发生严重的阻塞。

如何启用DAC功能 专用管理员连接功能以及注意事项

1、只有系統管理員(sysadmin)角色相關成員可以使用DAC連接存取SQL Server(Local)本地连接

2、一個執行個體只能存在一個DAC。

3、使用DAC通常是讓DBA查詢和排解SQL Server問題(當無法正常連接執行個體),

4、好比執行sp_who2、Kill SPID、DBCC SQLPERF、DBCC DROPCLEANBUFFERS …等,使用DAC連接時,切勿執行需耗費大量資源的命令,如DBCC CHECKDB、DBCC SHRINKDATABASE..等

5、使用DAC登录才能修改系统表或者查看系统表,以前SQL2000的时候你可以随便修改系统表,到了SQL2005就开始限制您了

开启DAC的SQL

  1. <span> 1</span> <span>USE</span><span> master
  2. </span><span> 2</span> <span>GO</span>
  3. <span> 3</span> sp_configure <span>'</span><span>show advanced options</span><span>'</span>, <span>1</span>
  4. <span> 4</span> <span>GO</span>
  5. <span> 5</span> sp_configure <span>'</span><span>remote admin connections</span><span>'</span>, <span>1</span>
  6. <span> 6</span> <span>GO</span>
  7. <span> 7</span> <span>RECONFIGURE</span> <span>WITH</span><span> OVERRIDE
  8. </span><span> 8</span> <span>GO</span>
  9. <span> 9</span>
  10. <span>10</span>
  11. <span>11</span> <span>SELECT</span> <span>*</span> <span>FROM</span> sys.configurations <span>where</span> name <span>=</span> <span>'</span><span>remote admin connections</span><span>'</span>

也可以在外围应用配置器那里开启

命令行下使用DAC登录
sqlcmd加上 /A 选项 专用管理连接
sqlcmd /S JOE /E /A
1>DBCC DROPCLEANBUFFERS
2>GO

排错和诊断的SQL

  1. <span>1</span> <span>SELECT</span> <span>*</span> <span>FROM</span><span> sys.dm_tran_locks
  2. </span><span>2</span> <span>SELECT</span> <span>*</span> <span>FROM</span><span> sys.dm_os_memory_cache_counters
  3. </span><span>3</span> <span>SELECT</span> <span>*</span> <span>FROM</span><span> sys.dm_exec_requests
  4. </span><span>4</span> <span>SELECT</span> <span>*</span> <span>FROM</span> sys.dm_exec_sessions

例如查询 sys.dm_tran_locks 以了解锁定状态

查询 sys.dm_os_memory_cache_counters ,检查缓存数量

查询sys.dm_exec_requests 和 sys.dm_exec_sessions 以了解活动的会话和请求。
避免使用需要消耗大量资源的 DMV(例如,sys.dm_tran_version_store 需要扫描整个版本存储区,并且会导致大量的 I/O)或使用了复杂联接的 DMV

在sqlserver management studio中使用DAC连接的时候,要选择新建查询或者数据库引擎查询,不能使用一上来默认的那个登录框进行DAC连接登录,那个

是连接数据库引擎的,如果用DAC连数据库引擎,会报不支持DAC连接。

下面说一下DAC侦听的端口号

若要了解 DAC 所侦听的端口号,可以看SQL错误日志
SQL错误日志
消息
Dedicated admin connection support was established for listening remotely on port 1434.

其他有关DAC错误日志的消息:

消息
Could not connect because the maximum number of '1' dedicated administrator connections already exists. Before a new connection can be made, the existing dedicated administrator connection must be dropped, either by logging off or ending the process. [客户端: 127.0.0.1]

消息
Configuration option 'remote admin connections' changed from 1 to 1. Run the RECONFIGURE statement to install

DAC的本地连接和远程连接的方式:

如果将 SQL Server 配置为接受远程管理连接,则必须使用显式端口号启动 DAC:

sqlcmd –Stcp:,

sqlcmd /Stcp:192.168.1.100,1434 /U sa /P test

SQL Server 错误日志列出了 DAC 的端口号,默认情况下为 1434。

如果将 SQL Server 配置为只接受本地 DAC 连接,请使用以下命令和环回适配器进行连接:

sqlcmd –S127.0.0.1,1434

或者

sqlcmd加上 /A 选项 专用管理连接
sqlcmd /S JOE /E /A

或者

或者

总结:经过本人的实验,发现无论你是用sqlcmd或者SSMS,本地连接还是远程连接,都要使用这种方式

sqlcmd –Stcp:,

本地:sqlcmd –S127.0.0.1,1434

远程:sqlcmd /Stcp:192.168.1.100,1434 /U sa /P test

网上有些文章说不用加端口号,启用SQL Browser服务,就可以连接SQLSERVER,实际上不加1434端口号的话,已经不是在使用DAC来

连接SQLSERVER了,不加1434端口号使用的只是普通连接


2013-11-30补充:

反编译了一下DAC的DLL

在下面的公用DLL路径

DAC功能应该就是调用这个路径下的C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Management.Dac.dll

ILSpy这个工具来反编译,实际上SQLSRVER很多功能组件都是用.NET来编写的

除非一些核心功能组件用C++或者C,你们会发现很多DLL都可以用ILSpy这个.NET反编译工具来反编译

微乳并没有混淆他们的代码,这些如果没有开发文档的话,要理解这些代码的层次结构和意思会比较困难

其中一个类的代码

  1. <span> 1</span> <span>using Microsoft.SqlServer.Management.Common;
  2. </span><span> 2</span> <span>using Microsoft.SqlServer.Management.Smo;
  3. </span><span> 3</span> <span>using Microsoft.SqlServer.Management.SmoMetadataProvider;
  4. </span><span> 4</span> <span>using Microsoft.SqlServer.Management.SqlParser.Common;
  5. </span><span> 5</span> <span>using Microsoft.SqlServer.Management.SqlParser.Metadata;
  6. </span><span> 6</span> <span>using Microsoft.SqlServer.Management.SqlParser.MetadataDifferencer;
  7. </span><span> 7</span> <span>using Microsoft.SqlServer.Management.SqlParser.MetadataServices;
  8. </span><span> 8</span> <span>using System;
  9. </span><span> 9</span> <span>using System.Collections;
  10. </span><span> 10</span> <span>using System.Collections.Generic;
  11. </span><span> 11</span> <span>using System.Globalization;
  12. </span><span> 12</span> <span>using System.IO;
  13. </span><span> 13</span> <span>using System.Linq;
  14. </span><span> 14</span> <span>using System.Runtime.CompilerServices;
  15. </span><span> 15</span> using System.<span>Text</span><span>;
  16. </span><span> 16</span> using System.<span>Text</span><span>.RegularExpressions;
  17. </span><span> 17</span> <span>using System.Xml;
  18. </span><span> 18</span> <span>namespace Microsoft.SqlServer.Management.Dac.UI
  19. </span><span> 19</span> <span>{
  20. </span><span> 20</span> <span> internal class InternalUIHooks
  21. </span><span> 21</span> <span> {
  22. </span><span> 22</span> <span> private static class DifferencerTestUtils
  23. </span><span> 23</span> <span> {
  24. </span><span> 24</span> <span> private class DacUtils
  25. </span><span> 25</span> <span> {
  26. </span><span> 26</span> <span>public</span> class MetadataObjectComparer : IComparer<span><</span>IMetadataObject<span>></span>
  27. <span> 27</span> <span> {
  28. </span><span> 28</span> <span>public</span> static InternalUIHooks.DifferencerTestUtils.DacUtils.MetadataObjectComparer Instance <span>=</span><span> new InternalUIHooks.DifferencerTestUtils.DacUtils.MetadataObjectComparer();
  29. </span><span> 29</span> <span>public</span> <span>int</span><span> Compare(IMetadataObject x, IMetadataObject y)
  30. </span><span> 30</span> <span> {
  31. </span><span> 31</span> <span>if</span><span> (object.ReferenceEquals(x, y))
  32. </span><span> 32</span> <span> {
  33. </span><span> 33</span> <span>return</span> <span>0</span><span>;
  34. </span><span> 34</span> <span> }
  35. </span><span> 35</span> <span>if</span> (x <span>==</span> <span>null</span><span>)
  36. </span><span> 36</span> <span> {
  37. </span><span> 37</span> <span>return</span> <span>-</span><span>1</span><span>;
  38. </span><span> 38</span> <span> }
  39. </span><span> 39</span> <span>if</span> (y <span>==</span> <span>null</span><span>)
  40. </span><span> 40</span> <span> {
  41. </span><span> 41</span> <span>return</span> <span>1</span><span>;
  42. </span><span> 42</span> <span> }
  43. </span><span> 43</span> IList<span><</span>IMetadataObject<span>></span> hierarchy <span>=</span><span> InternalUIHooks.DifferencerTestUtils.DacUtils.MetadataObjectComparer.GetHierarchy(x);
  44. </span><span> 44</span> IList<span><</span>IMetadataObject<span>></span> hierarchy2 <span>=</span><span> InternalUIHooks.DifferencerTestUtils.DacUtils.MetadataObjectComparer.GetHierarchy(y);
  45. </span><span> 45</span> <span>int</span> num <span>=</span> <span>0</span><span>;
  46. </span><span> 46</span> <span>while</span> (num <span><</span> hierarchy.<span>Count</span> <span>||</span> num <span><</span> hierarchy2.<span>Count</span><span>)
  47. </span><span> 47</span> <span> {
  48. </span><span> 48</span> <span>if</span> (num <span>>=</span> hierarchy.<span>Count</span><span>)
  49. </span><span> 49</span> <span> {
  50. </span><span> 50</span> <span>return</span> <span>-</span><span>1</span><span>;
  51. </span><span> 51</span> <span> }
  52. </span><span> 52</span> <span>if</span> (num <span>>=</span> hierarchy2.<span>Count</span><span>)
  53. </span><span> 53</span> <span> {
  54. </span><span> 54</span> <span>return</span> <span>1</span><span>;
  55. </span><span> 55</span> <span> }
  56. </span><span> 56</span> <span>int</span> num2 <span>=</span> hierarchy<span>[</span><span>num</span><span>]</span>.TypeInfo().CompareTo(hierarchy2<span>[</span><span>num</span><span>]</span><span>.TypeInfo());
  57. </span><span> 57</span> <span>if</span> (num2 <span>!=</span> <span>0</span><span>)
  58. </span><span> 58</span> <span> {
  59. </span><span> 59</span> <span>return</span><span> num2;
  60. </span><span> 60</span> <span> }
  61. </span><span> 61</span> <span>int</span> num3 <span>=</span> StringComparer.Ordinal.Compare(hierarchy<span>[</span><span>num</span><span>]</span>.Name, hierarchy2<span>[</span><span>num</span><span>]</span><span>.Name);
  62. </span><span> 62</span> <span>if</span> (num3 <span>!=</span> <span>0</span><span>)
  63. </span><span> 63</span> <span> {
  64. </span><span> 64</span> <span>return</span><span> num3;
  65. </span><span> 65</span> <span> }
  66. </span><span> 66</span> num<span>++</span><span>;
  67. </span><span> 67</span> <span> }
  68. </span><span> 68</span> <span>return</span> <span>0</span><span>;
  69. </span><span> 69</span> <span> }
  70. </span><span> 70</span> private static IList<span><</span>IMetadataObject<span>></span><span> GetHierarchy(IMetadataObject obj)
  71. </span><span> 71</span> <span> {
  72. </span><span> 72</span> List<span><</span>IMetadataObject<span>></span> list <span>=</span> new List<span><</span>IMetadataObject<span>></span><span>();
  73. </span><span> 73</span> <span>for</span> (IMetadataObject metadataObject <span>=</span> obj; metadataObject <span>!=</span> <span>null</span>; metadataObject <span>=</span><span> InternalUIHooks.DifferencerTestUtils.DacUtils.GetParentObjectSafe(metadataObject))
  74. </span><span> 74</span> <span> {
  75. </span><span> 75</span> list.<span>Add</span><span>(metadataObject);
  76. </span><span> 76</span> <span> }
  77. </span><span> 77</span> list.<span>Reverse</span><span>();
  78. </span><span> 78</span> <span>return</span><span> list;
  79. </span><span> 79</span> <span> }
  80. </span><span> 80</span> <span> }
  81. </span><span> 81</span> <span> internal static DacType CreateDacFromSql(string sql)
  82. </span><span> 82</span> <span> {
  83. </span><span> 83</span> <span>return</span> InternalUIHooks.DifferencerTestUtils.DacUtils.CreateDacFromSql(sql, new Version("<span>1.1</span>.<span>1.1</span><span>"), string.Empty);
  84. </span><span> 84</span> <span> }
  85. </span><span> 85</span> <span> internal static DacType CreateDacFromSql(string sql, Version version, string description)
  86. </span><span> 86</span> <span> {
  87. </span><span> 87</span> DacCompilationUnit dacCompilationUnit <span>=</span><span> new DacCompilationUnit("Dac", version, "SQL_Latin1_General_CP1_CI_AS");
  88. </span><span> 88</span> dacCompilationUnit.Description <span>=</span><span> description;
  89. </span><span> 89</span> <span> dacCompilationUnit.AddTSqlSourceFile("input.sql", sql);
  90. </span><span> 90</span> DacCompilationResult dacCompilationResult <span>=</span><span> dacCompilationUnit.Compile();
  91. </span><span> 91</span> List<span><</span>DacCompilationError<span>></span> list <span>=</span> new List<span><</span>DacCompilationError<span>></span><span>(dacCompilationResult.Errors);
  92. </span><span> 92</span> <span>if</span> (list.<span>Count</span> <span>!=</span> <span>0</span><span>)
  93. </span><span> 93</span> <span> {
  94. </span><span> 94</span> <span> InternalUIHooks.DifferencerTestUtils.DacUtils.PrintCompilationResultErrors(dacCompilationResult);
  95. </span><span> 95</span> <span> }
  96. </span><span> 96</span> <span>return</span><span> InternalUIHooks.DifferencerTestUtils.DacUtils.NormalizeDacType(dacCompilationResult.DacType);
  97. </span><span> 97</span> <span> }
  98. </span><span> 98</span> <span> private static DacType NormalizeDacType(DacType dacType)
  99. </span><span> 99</span> <span> {
  100. </span><span>100</span> <span> DacType result;
  101. </span><span>101</span> using (MemoryStream memoryStream <span>=</span><span> new MemoryStream())
  102. </span><span>102</span> <span> {
  103. </span><span>103</span> DacType.<span>Save</span><span>(dacType, memoryStream);
  104. </span><span>104</span> memoryStream.Seek(0L, SeekOrigin.<span>Begin</span><span>);
  105. </span><span>105</span> result <span>=</span> DacType.<span>Load</span><span>(memoryStream);
  106. </span><span>106</span> <span> }
  107. </span><span>107</span> <span>return</span><span> result;
  108. </span><span>108</span> <span> }
  109. </span><span>109</span> <span> private static void PrintCompilationResultErrors(DacCompilationResult result)
  110. </span><span>110</span> <span> {
  111. </span><span>111</span> List<span><</span>DacCompilationError<span>></span> list <span>=</span> new List<span><</span>DacCompilationError<span>></span><span>(result.Errors);
  112. </span><span>112</span> Console.WriteLine("Compilation Result Errors (" <span>+</span> list.<span>Count</span> <span>+</span><span> ")");
  113. </span><span>113</span> foreach (DacCompilationError <span>current</span> <span>in</span><span> list)
  114. </span><span>114</span> <span> {
  115. </span><span>115</span> Console.WriteLine("\t<span>-</span> {<span>0</span>}{<span>1</span>}: " <span>+</span> <span>current</span>.ToString(), <span>current</span>.IsWarning ? "Warning" : "Error", (<span>current</span>.SourceInfo <span>!=</span> <span>null</span>) ? (" " <span>+</span> InternalUIHooks.DifferencerTestUtils.DacUtils.GetLocationString(<span>current</span><span>.SourceInfo)) : "");
  116. </span><span>116</span> <span> }
  117. </span><span>117</span> <span> Console.WriteLine();
  118. </span><span>118</span> <span> }
  119. </span><span>119</span> <span> private static string GetLocationString(SourceInfo sourceInfo)
  120. </span><span>120</span> <span> {
  121. </span><span>121</span> <span>return</span> string.Concat(new object<span>[]</span>
  122. <span>122</span> <span> {
  123. </span><span>123</span> <span> sourceInfo.Filename,
  124. </span><span>124</span> <span> ":",
  125. </span><span>125</span> <span> sourceInfo.Start.LineNumber,
  126. </span><span>126</span> <span> ",",
  127. </span><span>127</span> <span> sourceInfo.Start.ColumnNumber
  128. </span><span>128</span> <span> });
  129. </span><span>129</span> <span> }
  130. </span><span>130</span> <span>public</span><span> static DacType CreateDacFromFile(string fileName)
  131. </span><span>131</span> <span> {
  132. </span><span>132</span> string sql <span>=</span> <span>File</span><span>.ReadAllText(fileName);
  133. </span><span>133</span> <span>return</span><span> InternalUIHooks.DifferencerTestUtils.DacUtils.CreateDacFromSql(sql);
  134. </span><span>134</span> <span> }
  135. </span><span>135</span> <span>public</span><span> static DacType CreateDacFromFile(string fileName, Version version, string description)
  136. </span><span>136</span> <span> {
  137. </span><span>137</span> string sql <span>=</span> <span>File</span><span>.ReadAllText(fileName);
  138. </span><span>138</span> <span>return</span><span> InternalUIHooks.DifferencerTestUtils.DacUtils.CreateDacFromSql(sql, version, description);
  139. </span><span>139</span> <span> }
  140. </span><span>140</span> <span>public</span><span> static string GetMetadataObjectIdString(IMetadataObject obj)
  141. </span><span>141</span> <span> {
  142. </span><span>142</span> List<span><</span>string<span>></span> list <span>=</span> new List<span><</span>string<span>></span><span>();
  143. </span><span>143</span> IMetadataObject metadataObject <span>=</span><span> obj;
  144. </span><span>144</span> <span>while</span><span> (true)
  145. </span><span>145</span> <span> {
  146. </span><span>146</span> TypeInfo typeInfo <span>=</span><span> metadataObject.TypeInfo();
  147. </span><span>147</span> string <span>text</span> <span>=</span> typeInfo.Name.<span>Substring</span>(<span>1</span><span>);
  148. </span><span>148</span> string item <span>=</span> string.Format(CultureInfo.InvariantCulture, "{<span>0</span>}{<span>1</span>}", new object<span>[]</span>
  149. <span>149</span> <span> {
  150. </span><span>150</span> <span>text</span><span>,
  151. </span><span>151</span> (!(metadataObject <span>is</span> IServer)) ? ("<span>[</span><span>" + metadataObject.Name.Replace("</span><span>]</span>", "]]") <span>+</span><span> "]") : string.Empty
  152. </span><span>152</span> <span> });
  153. </span><span>153</span> list.<span>Add</span><span>(item);
  154. </span><span>154</span> <span>if</span> (metadataObject <span>is</span><span> IServer)
  155. </span><span>155</span> <span> {
  156. </span><span>156</span> <span>break</span><span>;
  157. </span><span>157</span> <span> }
  158. </span><span>158</span> metadataObject <span>=</span><span> InternalUIHooks.DifferencerTestUtils.DacUtils.GetParentObject(metadataObject);
  159. </span><span>159</span> <span> }
  160. </span><span>160</span> list.<span>Reverse</span><span>();
  161. </span><span>161</span> <span>return</span> string.<span>Join</span>("<span>/</span><span>", list.ToArray());
  162. </span><span>162</span> <span> }
  163. </span><span>163</span> <span>public</span><span> static string GetMetadataObjectTypeString(IMetadataObject obj)
  164. </span><span>164</span> <span> {
  165. </span><span>165</span> <span>return</span> obj.TypeInfo().Name.<span>Substring</span>(<span>1</span><span>);
  166. </span><span>166</span> <span> }
  167. </span><span>167</span> <span>public</span><span> static IMetadataObject GetParentObject(IMetadataObject obj)
  168. </span><span>168</span> <span> {
  169. </span><span>169</span> MetadataTypeInfo metadataTypeInfo <span>=</span><span> obj.TypeInfo();
  170. </span><span>170</span> MetadataPropertyInfo parentProperty <span>=</span><span> metadataTypeInfo.ParentProperty;
  171. </span><span>171</span> object propertyValue <span>=</span><span> MetadataUtils.GetPropertyValue(obj, metadataTypeInfo, parentProperty);
  172. </span><span>172</span> <span>return</span><span> (IMetadataObject)propertyValue;
  173. </span><span>173</span> <span> }
  174. </span><span>174</span> <span>public</span><span> static IMetadataObject GetParentObjectSafe(IMetadataObject obj)
  175. </span><span>175</span> <span> {
  176. </span><span>176</span> MetadataTypeInfo metadataTypeInfo <span>=</span><span> obj.TypeInfo();
  177. </span><span>177</span> MetadataPropertyInfo parentProperty <span>=</span><span> metadataTypeInfo.ParentProperty;
  178. </span><span>178</span> <span>if</span> (parentProperty <span>==</span> <span>null</span><span>)
  179. </span><span>179</span> <span> {
  180. </span><span>180</span> <span>return</span> <span>null</span><span>;
  181. </span><span>181</span> <span> }
  182. </span><span>182</span> object propertyValue <span>=</span><span> MetadataUtils.GetPropertyValue(obj, metadataTypeInfo, parentProperty);
  183. </span><span>183</span> <span>return</span><span> (IMetadataObject)propertyValue;
  184. </span><span>184</span> <span> }
  185. </span><span>185</span> <span>public</span><span> static void WriteObject(XmlWriter writer, object value, bool writeDefinition)
  186. </span><span>186</span> <span> {
  187. </span><span>187</span> Type type <span>=</span> (value <span>!=</span> <span>null</span>) ? value.GetType() : <span>null</span><span>;
  188. </span><span>188</span> <span>if</span> (value <span>==</span> <span>null</span><span>)
  189. </span><span>189</span> <span> {
  190. </span><span>190</span> writer.WriteAttributeString("<span>isNull</span><span>", true.ToString());
  191. </span><span>191</span> <span>return</span><span>;
  192. </span><span>192</span> <span> }
  193. </span><span>193</span> <span>if</span> (type.IsPrimitive <span>||</span> type.IsEnum <span>||</span> type <span>==</span><span> typeof(string))
  194. </span><span>194</span> <span> {
  195. </span><span>195</span> <span> writer.WriteString(value.ToString());
  196. </span><span>196</span> <span>return</span><span>;
  197. </span><span>197</span> <span> }
  198. </span><span>198</span> <span>if</span> (type <span>==</span><span> typeof(IdentityColumnInfo))
  199. </span><span>199</span> <span> {
  200. </span><span>200</span> <span> writer.WriteStartElement("Increment");
  201. </span><span>201</span> <span> InternalUIHooks.DifferencerTestUtils.DacUtils.WriteObject(writer, ((IdentityColumnInfo)value).Increment, true);
  202. </span><span>202</span> <span> writer.WriteEndElement();
  203. </span><span>203</span> <span> writer.WriteStartElement("Seed");
  204. </span><span>204</span> <span> InternalUIHooks.DifferencerTestUtils.DacUtils.WriteObject(writer, ((IdentityColumnInfo)value).Seed, true);
  205. </span><span>205</span> <span> writer.WriteEndElement();
  206. </span><span>206</span> <span>return</span><span>;
  207. </span><span>207</span> <span> }
  208. </span><span>208</span> <span>if</span> (type <span>==</span><span> typeof(ComputedColumnInfo))
  209. </span><span>209</span> <span> {
  210. </span><span>210</span> <span> writer.WriteStartElement("IsPersisted");
  211. </span><span>211</span> <span> InternalUIHooks.DifferencerTestUtils.DacUtils.WriteObject(writer, ((ComputedColumnInfo)value).IsPersisted, true);
  212. </span><span>212</span> <span> writer.WriteEndElement();
  213. </span><span>213</span> writer.WriteStartElement("<span>Text</span><span>");
  214. </span><span>214</span> InternalUIHooks.DifferencerTestUtils.DacUtils.WriteObject(writer, ((ComputedColumnInfo)value).<span>Text</span><span>, true);
  215. </span><span>215</span> <span> writer.WriteEndElement();
  216. </span><span>216</span> <span>return</span><span>;
  217. </span><span>217</span> <span> }
  218. </span><span>218</span> <span>if</span> (type <span>==</span><span> typeof(DataTypeSpec))
  219. </span><span>219</span> <span> {
  220. </span><span>220</span> <span> writer.WriteString(((DataTypeSpec)value).SqlDataType.ToString());
  221. </span><span>221</span> <span>return</span><span>;
  222. </span><span>222</span> <span> }
  223. </span><span>223</span> <span>if</span> (type <span>==</span><span> typeof(CollationInfo))
  224. </span><span>224</span> <span> {
  225. </span><span>225</span> <span> writer.WriteStartElement("CollationInfo");
  226. </span><span>226</span> <span> InternalUIHooks.DifferencerTestUtils.DacUtils.WriteObject(writer, ((CollationInfo)value).Name, true);
  227. </span><span>227</span> <span> writer.WriteEndElement();
  228. </span><span>228</span> <span>return</span><span>;
  229. </span><span>229</span> <span> }
  230. </span><span>230</span> <span>if</span> (value <span>is</span><span> ISystemClrDataType)
  231. </span><span>231</span> <span> {
  232. </span><span>232</span> <span> writer.WriteStartElement("ISystemClrDataType");
  233. </span><span>233</span> <span> InternalUIHooks.DifferencerTestUtils.DacUtils.WriteObject(writer, ((ISystemClrDataType)value).Name, true);
  234. </span><span>234</span> <span> writer.WriteEndElement();
  235. </span><span>235</span> <span>return</span><span>;
  236. </span><span>236</span> <span> }
  237. </span><span>237</span> <span>if</span> (value <span>is</span><span> IMetadataObject)
  238. </span><span>238</span> <span> {
  239. </span><span>239</span> IMetadataObject obj <span>=</span><span> (IMetadataObject)value;
  240. </span><span>240</span> MetadataTypeInfo metadataTypeInfo <span>=</span><span> obj.TypeInfo();
  241. </span><span>241</span> <span>if</span> (metadataTypeInfo.IsValue <span>||</span> (metadataTypeInfo.IsReference <span>&&</span><span> writeDefinition))
  242. </span><span>242</span> <span> {
  243. </span><span>243</span> <span> writer.WriteStartElement(InternalUIHooks.DifferencerTestUtils.DacUtils.GetMetadataObjectTypeString(obj));
  244. </span><span>244</span> foreach (MetadataPropertyInfo <span>current</span> <span>in</span><span> metadataTypeInfo.InstanceProperties)
  245. </span><span>245</span> <span> {
  246. </span><span>246</span> object propertyValue <span>=</span> MetadataUtils.GetPropertyValue(obj, metadataTypeInfo, <span>current</span><span>);
  247. </span><span>247</span> writer.WriteStartElement(<span>current</span><span>.Name);
  248. </span><span>248</span> InternalUIHooks.DifferencerTestUtils.DacUtils.WriteObject(writer, propertyValue, writeDefinition <span>&&</span> <span>current</span>.PropertyType <span>==</span><span> PropertyType.Child);
  249. </span><span>249</span> <span> writer.WriteEndElement();
  250. </span><span>250</span> <span> }
  251. </span><span>251</span> <span> writer.WriteEndElement();
  252. </span><span>252</span> <span>return</span><span>;
  253. </span><span>253</span> <span> }
  254. </span><span>254</span> <span>if</span><span> (metadataTypeInfo.IsReference)
  255. </span><span>255</span> <span> {
  256. </span><span>256</span> <span> writer.WriteAttributeString("id", InternalUIHooks.DifferencerTestUtils.DacUtils.GetMetadataObjectIdString(obj));
  257. </span><span>257</span> <span>return</span><span>;
  258. </span><span>258</span> <span> }
  259. </span><span>259</span> <span> }
  260. </span><span>260</span> <span>else</span>
  261. <span>261</span> <span> {
  262. </span><span>262</span> <span>if</span> (value <span>is</span><span> IEnumerable)
  263. </span><span>263</span> <span> {
  264. </span><span>264</span> foreach (object current2 <span>in</span><span> (IEnumerable)value)
  265. </span><span>265</span> <span> {
  266. </span><span>266</span> string localName <span>=</span> (current2 <span>is</span><span> IMetadataObject) ? InternalUIHooks.DifferencerTestUtils.DacUtils.GetMetadataObjectTypeString((IMetadataObject)current2) : "Item";
  267. </span><span>267</span> <span> writer.WriteStartElement(localName);
  268. </span><span>268</span> <span> InternalUIHooks.DifferencerTestUtils.DacUtils.WriteObject(writer, current2, writeDefinition);
  269. </span><span>269</span> <span> writer.WriteEndElement();
  270. </span><span>270</span> <span> }
  271. </span><span>271</span> <span> }
  272. </span><span>272</span> <span> }
  273. </span><span>273</span> <span> }
  274. </span><span>274</span> <span> }
  275. </span><span>275</span> <span>public</span><span> static void WriteChangeResult(XmlWriter writer, ChangeResult changeResult)
  276. </span><span>276</span> <span> {
  277. </span><span>277</span> <span> writer.WriteStartElement("ChangeResult");
  278. </span><span>278</span> <span> writer.WriteStartElement("CreatedObjects");
  279. </span><span>279</span> <span> InternalUIHooks.DifferencerTestUtils.WriteObjectRefs(writer, changeResult.CreatedObjects);
  280. </span><span>280</span> <span> writer.WriteEndElement();
  281. </span><span>281</span> <span> writer.WriteStartElement("DeletedObjects");
  282. </span><span>282</span> <span> InternalUIHooks.DifferencerTestUtils.WriteObjectRefs(writer, changeResult.DeletedObjects);
  283. </span><span>283</span> <span> writer.WriteEndElement();
  284. </span><span>284</span> <span> writer.WriteStartElement("ModifiedObjects");
  285. </span><span>285</span> InternalUIHooks.DifferencerTestUtils.WriteModifiedObjects(writer, changeResult.SourceModifiedObjects.<span>Values</span><span>);
  286. </span><span>286</span> <span> writer.WriteEndElement();
  287. </span><span>287</span> <span> writer.WriteEndElement();
  288. </span><span>288</span> <span> }
  289. </span><span>289</span> <span>public</span> static void WriteModifiedObjects(XmlWriter writer, IEnumerable<span><</span>ObjectDifference<span>></span><span> objectDifferenceCollection)
  290. </span><span>290</span> <span> {
  291. </span><span>291</span> List<span><</span>ObjectDifference<span>></span> list <span>=</span> objectDifferenceCollection.ToList<span><</span>ObjectDifference<span>></span><span>();
  292. </span><span>292</span> list.Sort((ObjectDifference x, ObjectDifference y) <span>=></span> InternalUIHooks.DifferencerTestUtils.DacUtils.MetadataObjectComparer.Instance.Compare(x.ChangedObjectSource, y.ChangedObjectSource) <span>*</span> <span>2</span> <span>+</span><span> InternalUIHooks.DifferencerTestUtils.DacUtils.MetadataObjectComparer.Instance.Compare(x.ChangedObjectTarget, y.ChangedObjectTarget));
  293. </span><span>293</span> <span> list.ForEach(delegate(ObjectDifference diff)
  294. </span><span>294</span> <span> {
  295. </span><span>295</span> <span> InternalUIHooks.DifferencerTestUtils.WriteObjectDifference(writer, diff);
  296. </span><span>296</span> <span> }
  297. </span><span>297</span> <span> );
  298. </span><span>298</span> <span> }
  299. </span><span>299</span> <span>public</span><span> static void WriteObjectDifference(XmlWriter writer, ObjectDifference objectDifference)
  300. </span><span>300</span> <span> {
  301. </span><span>301</span> <span> writer.WriteStartElement(InternalUIHooks.DifferencerTestUtils.DacUtils.GetMetadataObjectTypeString(objectDifference.ChangedObjectSource));
  302. </span><span>302</span> <span> writer.WriteStartElement("ChangedObjectSource");
  303. </span><span>303</span> <span> writer.WriteAttributeString("Id", InternalUIHooks.DifferencerTestUtils.DacUtils.GetMetadataObjectIdString(objectDifference.ChangedObjectSource));
  304. </span><span>304</span> <span> writer.WriteEndElement();
  305. </span><span>305</span> <span> writer.WriteStartElement("ChangedObjectTarget");
  306. </span><span>306</span> <span> writer.WriteAttributeString("Id", InternalUIHooks.DifferencerTestUtils.DacUtils.GetMetadataObjectIdString(objectDifference.ChangedObjectTarget));
  307. </span><span>307</span> <span> writer.WriteEndElement();
  308. </span><span>308</span> <span> writer.WriteStartElement("Properties");
  309. </span><span>309</span> List<span><</span>PropertyDifference<span>></span> list <span>=</span><span> (
  310. </span><span>310</span> <span>from</span> p <span>in</span> objectDifference.PropertyDifferences.<span>Values</span>
  311. <span>311</span> <span> orderby p.Name
  312. </span><span>312</span> <span>select</span> p).ToList<span><</span>PropertyDifference<span>></span><span>();
  313. </span><span>313</span> <span> list.ForEach(delegate(PropertyDifference p)
  314. </span><span>314</span> <span> {
  315. </span><span>315</span> <span> InternalUIHooks.DifferencerTestUtils.WritePropertyDifference(writer, p);
  316. </span><span>316</span> <span> }
  317. </span><span>317</span> <span> );
  318. </span><span>318</span> <span> writer.WriteEndElement();
  319. </span><span>319</span> <span> writer.WriteEndElement();
  320. </span><span>320</span> <span> }
  321. </span><span>321</span> <span>public</span><span> static void WritePropertyDifference(XmlWriter writer, PropertyDifference propertyDifference)
  322. </span><span>322</span> <span> {
  323. </span><span>323</span> <span> writer.WriteStartElement(propertyDifference.Name);
  324. </span><span>324</span> <span>if</span> (propertyDifference <span>is</span><span> OrderedCollectionDifference)
  325. </span><span>325</span> <span> {
  326. </span><span>326</span> OrderedCollectionDifference orderedCollectionDifference <span>=</span> propertyDifference <span>as</span><span> OrderedCollectionDifference;
  327. </span><span>327</span> using (IEnumerator<span><</span>OrderedScalarDifference<span>></span> enumerator <span>=</span><span> orderedCollectionDifference.OrderDifferences.GetEnumerator())
  328. </span><span>328</span> <span> {
  329. </span><span>329</span> <span>while</span><span> (enumerator.MoveNext())
  330. </span><span>330</span> <span> {
  331. </span><span>331</span> OrderedScalarDifference <span>current</span> <span>=</span> enumerator.<span>Current</span><span>;
  332. </span><span>332</span> writer.WriteStartElement(InternalUIHooks.DifferencerTestUtils.DacUtils.GetMetadataObjectTypeString((IMetadataObject)<span>current</span><span>.SourceValue));
  333. </span><span>333</span> writer.WriteAttributeString("sourceIndex", <span>current</span><span>.SourceIndex.ToString(CultureInfo.InvariantCulture));
  334. </span><span>334</span> writer.WriteAttributeString("targetIndex", <span>current</span><span>.TargetIndex.ToString(CultureInfo.InvariantCulture));
  335. </span><span>335</span> <span> writer.WriteStartElement("SourceValue");
  336. </span><span>336</span> InternalUIHooks.DifferencerTestUtils.DacUtils.WriteObject(writer, <span>current</span><span>.SourceValue, false);
  337. </span><span>337</span> <span> writer.WriteEndElement();
  338. </span><span>338</span> <span> writer.WriteStartElement("TargetValue");
  339. </span><span>339</span> InternalUIHooks.DifferencerTestUtils.DacUtils.WriteObject(writer, <span>current</span><span>.TargetValue, false);
  340. </span><span>340</span> <span> writer.WriteEndElement();
  341. </span><span>341</span> <span> writer.WriteEndElement();
  342. </span><span>342</span> <span> }
  343. </span><span>343</span> <span>goto</span><span> IL_12E;
  344. </span><span>344</span> <span> }
  345. </span><span>345</span> <span> }
  346. </span><span>346</span> <span>if</span> (propertyDifference <span>is</span><span> ScalarDifference)
  347. </span><span>347</span> <span> {
  348. </span><span>348</span> ScalarDifference scalarDifference <span>=</span> propertyDifference <span>as</span><span> ScalarDifference;
  349. </span><span>349</span> <span> writer.WriteStartElement("SourceValue");
  350. </span><span>350</span> <span> InternalUIHooks.DifferencerTestUtils.DacUtils.WriteObject(writer, scalarDifference.SourceValue, false);
  351. </span><span>351</span> <span> writer.WriteEndElement();
  352. </span><span>352</span> <span> writer.WriteStartElement("TargetValue");
  353. </span><span>353</span> <span> InternalUIHooks.DifferencerTestUtils.DacUtils.WriteObject(writer, scalarDifference.TargetValue, false);
  354. </span><span>354</span> <span> writer.WriteEndElement();
  355. </span><span>355</span> <span> }
  356. </span><span>356</span> <span> IL_12E:
  357. </span><span>357</span> <span> writer.WriteEndElement();
  358. </span><span>358</span> <span> }
  359. </span><span>359</span> <span>public</span> static void WriteObjectRefs(XmlWriter writer, IEnumerable<span><</span>IMetadataObject<span>></span><span> objectCollection)
  360. </span><span>360</span> <span> {
  361. </span><span>361</span> List<span><</span>IMetadataObject<span>></span> list <span>=</span> objectCollection.ToList<span><</span>IMetadataObject<span>></span><span>();
  362. </span><span>362</span> <span> list.Sort(InternalUIHooks.DifferencerTestUtils.DacUtils.MetadataObjectComparer.Instance);
  363. </span><span>363</span> foreach (IMetadataObject <span>current</span> <span>in</span><span> list)
  364. </span><span>364</span> <span> {
  365. </span><span>365</span> writer.WriteStartElement(InternalUIHooks.DifferencerTestUtils.DacUtils.GetMetadataObjectTypeString(<span>current</span><span>));
  366. </span><span>366</span> InternalUIHooks.DifferencerTestUtils.DacUtils.WriteObject(writer, <span>current</span><span>, false);
  367. </span><span>367</span> <span> writer.WriteEndElement();
  368. </span><span>368</span> <span> }
  369. </span><span>369</span> <span> }
  370. </span><span>370</span> <span>public</span><span> static bool IsChangeResultDrift(ChangeResult changeResult)
  371. </span><span>371</span> <span> {
  372. </span><span>372</span> bool flag <span>=</span> changeResult.CreatedObjects.<span>Count</span><span><</span>IMetadataObject<span>></span>() <span>!=</span> <span>0</span> <span>||</span> changeResult.DeletedObjects.<span>Count</span><span><</span>IMetadataObject<span>></span>() <span>!=</span> <span>0</span><span>;
  373. </span><span>373</span> foreach (ObjectDifference <span>current</span> <span>in</span> changeResult.SourceModifiedObjects.<span>Values</span><span>)
  374. </span><span>374</span> <span> {
  375. </span><span>375</span> flag <span>=</span> (!(<span>current</span>.ChangedObjectSource <span>is</span> IConstraint) <span>||</span> (flag <span>|</span> InternalUIHooks.DifferencerTestUtils.IsConstraintDifferenceDrift(<span>current</span><span>)));
  376. </span><span>376</span> <span> }
  377. </span><span>377</span> <span>return</span><span> flag;
  378. </span><span>378</span> <span> }
  379. </span><span>379</span> <span> private static bool IsConstraintDifferenceDrift(ObjectDifference objectDifference)
  380. </span><span>380</span> <span> {
  381. </span><span>381</span> bool result <span>=</span><span> false;
  382. </span><span>382</span> foreach (PropertyDifference <span>current</span> <span>in</span> objectDifference.PropertyDifferences.<span>Values</span><span>)
  383. </span><span>383</span> <span> {
  384. </span><span>384</span> <span>if</span> (<span>current</span>.Name <span>==</span><span> "IsChecked")
  385. </span><span>385</span> <span> {
  386. </span><span>386</span> <span>if</span> (!InternalUIHooks.DifferencerTestUtils.IsNotForReplicationConstraint((IConstraint)objectDifference.ChangedObjectSource) <span>&&</span><span> !InternalUIHooks.DifferencerTestUtils.IsNotForReplicationConstraint((IConstraint)objectDifference.ChangedObjectTarget))
  387. </span><span>387</span> <span> {
  388. </span><span>388</span> result <span>=</span><span> true;
  389. </span><span>389</span> <span> }
  390. </span><span>390</span> <span> }
  391. </span><span>391</span> <span>else</span>
  392. <span>392</span> <span> {
  393. </span><span>393</span> result <span>=</span><span> true;
  394. </span><span>394</span> <span> }
  395. </span><span>395</span> <span> }
  396. </span><span>396</span> <span>return</span><span> result;
  397. </span><span>397</span> <span> }
  398. </span><span>398</span> private static bool IsNotForReplicationConstraint(IConstraint <span>constraint</span><span>)
  399. </span><span>399</span> <span> {
  400. </span><span>400</span> <span> bool result;
  401. </span><span>401</span> switch (<span>constraint</span><span>.Type)
  402. </span><span>402</span> <span> {
  403. </span><span>403</span> <span>case</span> ConstraintType.<span>Check</span><span>:
  404. </span><span>404</span> <span> {
  405. </span><span>405</span> result <span>=</span> ((ICheckConstraint)<span>constraint</span><span>).NotForReplication;
  406. </span><span>406</span> <span>break</span><span>;
  407. </span><span>407</span> <span> }
  408. </span><span>408</span> <span>case</span><span> ConstraintType.ForeignKey:
  409. </span><span>409</span> <span> {
  410. </span><span>410</span> result <span>=</span> ((IForeignKeyConstraint)<span>constraint</span><span>).NotForReplication;
  411. </span><span>411</span> <span>break</span><span>;
  412. </span><span>412</span> <span> }
  413. </span><span>413</span> <span>case</span><span> ConstraintType.PrimaryKey:
  414. </span><span>414</span> <span>case</span> ConstraintType.<span>Unique</span><span>:
  415. </span><span>415</span> <span> {
  416. </span><span>416</span> result <span>=</span><span> false;
  417. </span><span>417</span> <span>break</span><span>;
  418. </span><span>418</span> <span> }
  419. </span><span>419</span> <span>default</span><span>:
  420. </span><span>420</span> <span> {
  421. </span><span>421</span> result <span>=</span><span> false;
  422. </span><span>422</span> <span>break</span><span>;
  423. </span><span>423</span> <span> }
  424. </span><span>424</span> <span> }
  425. </span><span>425</span> <span>return</span><span> result;
  426. </span><span>426</span> <span> }
  427. </span><span>427</span> <span> }
  428. </span><span>428</span> <span>public</span> const string DacTypeName <span>=</span><span> "Dac";
  429. </span><span>429</span> <span>public</span> const string DefaultCollation <span>=</span><span> "SQL_Latin1_General_CP1_CI_AS";
  430. </span><span>430</span> <span>public</span><span> event TextUpdateHandler ScriptUpdate
  431. </span><span>431</span> <span> {
  432. </span><span>432</span> <span>[</span><span>MethodImpl(MethodImplOptions.Synchronized)</span><span>]</span>
  433. <span>433</span> <span>add</span>
  434. <span>434</span> <span> {
  435. </span><span>435</span> this.ScriptUpdate <span>=</span><span> (TextUpdateHandler)Delegate.Combine(this.ScriptUpdate, value);
  436. </span><span>436</span> <span> }
  437. </span><span>437</span> <span>[</span><span>MethodImpl(MethodImplOptions.Synchronized)</span><span>]</span>
  438. <span>438</span> <span> remove
  439. </span><span>439</span> <span> {
  440. </span><span>440</span> this.ScriptUpdate <span>=</span><span> (TextUpdateHandler)Delegate.Remove(this.ScriptUpdate, value);
  441. </span><span>441</span> <span> }
  442. </span><span>442</span> <span> }
  443. </span><span>443</span> <span>public</span><span> event TextUpdateHandler ModelUpdate
  444. </span><span>444</span> <span> {
  445. </span><span>445</span> <span>[</span><span>MethodImpl(MethodImplOptions.Synchronized)</span><span>]</span>
  446. <span>446</span> <span>add</span>
  447. <span>447</span> <span> {
  448. </span><span>448</span> this.ModelUpdate <span>=</span><span> (TextUpdateHandler)Delegate.Combine(this.ModelUpdate, value);
  449. </span><span>449</span> <span> }
  450. </span><span>450</span> <span>[</span><span>MethodImpl(MethodImplOptions.Synchronized)</span><span>]</span>
  451. <span>451</span> <span> remove
  452. </span><span>452</span> <span> {
  453. </span><span>453</span> this.ModelUpdate <span>=</span><span> (TextUpdateHandler)Delegate.Remove(this.ModelUpdate, value);
  454. </span><span>454</span> <span> }
  455. </span><span>455</span> <span> }
  456. </span><span>456</span> <span>public</span><span> event TextUpdateHandler ActionUpdate
  457. </span><span>457</span> <span> {
  458. </span><span>458</span> <span>[</span><span>MethodImpl(MethodImplOptions.Synchronized)</span><span>]</span>
  459. <span>459</span> <span>add</span>
  460. <span>460</span> <span> {
  461. </span><span>461</span> this.ActionUpdate <span>=</span><span> (TextUpdateHandler)Delegate.Combine(this.ActionUpdate, value);
  462. </span><span>462</span> <span> }
  463. </span><span>463</span> <span>[</span><span>MethodImpl(MethodImplOptions.Synchronized)</span><span>]</span>
  464. <span>464</span> <span> remove
  465. </span><span>465</span> <span> {
  466. </span><span>466</span> this.ActionUpdate <span>=</span><span> (TextUpdateHandler)Delegate.Remove(this.ActionUpdate, value);
  467. </span><span>467</span> <span> }
  468. </span><span>468</span> <span> }
  469. </span><span>469</span> <span>public</span><span> DacType CreateDacFromSql(string sql)
  470. </span><span>470</span> <span> {
  471. </span><span>471</span> <span>return</span> this.CreateDacFromSql(sql, new Version("<span>1.1</span>.<span>1.1</span><span>"), string.Empty);
  472. </span><span>472</span> <span> }
  473. </span><span>473</span> <span>public</span><span> DacType CreateDacFromSql(string sql, Version version, string description)
  474. </span><span>474</span> <span> {
  475. </span><span>475</span> DacCompilationUnit dacCompilationUnit <span>=</span><span> new DacCompilationUnit("Dac", version, "SQL_Latin1_General_CP1_CI_AS");
  476. </span><span>476</span> dacCompilationUnit.Description <span>=</span><span> description;
  477. </span><span>477</span> <span> dacCompilationUnit.AddTSqlSourceFile("input.sql", sql);
  478. </span><span>478</span> DacCompilationResult dacCompilationResult <span>=</span><span> dacCompilationUnit.Compile();
  479. </span><span>479</span> List<span><</span>DacCompilationError<span>></span> list <span>=</span> new List<span><</span>DacCompilationError<span>></span><span>(dacCompilationResult.Errors);
  480. </span><span>480</span> <span>if</span> (list.<span>Count</span> <span>!=</span> <span>0</span><span>)
  481. </span><span>481</span> <span> {
  482. </span><span>482</span> StringBuilder stringBuilder <span>=</span><span> new StringBuilder();
  483. </span><span>483</span> stringBuilder.Append("<span>***</span>COMPILE ERROR<span>***</span><span>");
  484. </span><span>484</span> <span> stringBuilder.Append(Environment.NewLine);
  485. </span><span>485</span> foreach (DacCompilationError <span>current</span> <span>in</span><span> list)
  486. </span><span>486</span> <span> {
  487. </span><span>487</span> stringBuilder.Append(<span>current</span><span>.Message);
  488. </span><span>488</span> <span> stringBuilder.Append(Environment.NewLine);
  489. </span><span>489</span> <span> }
  490. </span><span>490</span> <span> this.OnScriptUpdate(stringBuilder.ToString());
  491. </span><span>491</span> <span>return</span> <span>null</span><span>;
  492. </span><span>492</span> <span> }
  493. </span><span>493</span> <span>return</span><span> this.NormalizeDacType(dacCompilationResult.DacType);
  494. </span><span>494</span> <span> }
  495. </span><span>495</span> <span>public</span><span> void CompareSQLScripts(string sourceSQL, string targetSQL, bool isAzure)
  496. </span><span>496</span> <span> {
  497. </span><span>497</span> <span> this.OnActionUpdate("Building Source SQL DAC");
  498. </span><span>498</span> DacType dacType <span>=</span> this.CreateDacFromSql(sourceSQL, new Version("<span>1.1</span>.<span>1.1</span><span>"), "V1");
  499. </span><span>499</span> <span> this.OnActionUpdate("Building Target SQL DAC");
  500. </span><span>500</span> DacType dacType2 <span>=</span> this.CreateDacFromSql(targetSQL, new Version("<span>2.2</span>.<span>2.2</span><span>"), "V2");
  501. </span><span>501</span> <span> this.OnActionUpdate("Preparing Incremental Upgrade Script");
  502. </span><span>502</span> PrepareIncrementalUpgradeScriptStep prepareIncrementalUpgradeScriptStep <span>=</span><span> new PrepareIncrementalUpgradeScriptStep(dacType.Definition, "Dac", dacType2.Definition, "Dac", this.GetDefaultDifferencerFilter(), isAzure ? ScriptTarget.SqlAzure : ScriptTarget.Sql100, false);
  503. </span><span>503</span> prepareIncrementalUpgradeScriptStep.<span>Execute</span><span>();
  504. </span><span>504</span> IEnumerable<span><</span>ActionGroup<span>></span> incrementalUpgradeActionGroups <span>=</span><span> prepareIncrementalUpgradeScriptStep.GetIncrementalUpgradeActionGroups();
  505. </span><span>505</span> foreach (ActionGroup <span>current</span> <span>in</span><span> incrementalUpgradeActionGroups)
  506. </span><span>506</span> <span> {
  507. </span><span>507</span> ActionGroupScripter actionGroupScripter <span>=</span> <span>current</span><span>.GetActionGroupScripter(ScriptTarget.Sql100);
  508. </span><span>508</span> <span> this.OnActionUpdate(actionGroupScripter.Description);
  509. </span><span>509</span> <span> }
  510. </span><span>510</span> <span> this.OnScriptUpdate(prepareIncrementalUpgradeScriptStep.CompleteScript);
  511. </span><span>511</span> this.OnModelUpdate(this.GetChangeResultOutput(dacType.Definition.Databases<span>[</span><span>"Dac"</span><span>]</span>, dacType2.Definition.Databases<span>[</span><span>"Dac"</span><span>]</span><span>));
  512. </span><span>512</span> <span> }
  513. </span><span>513</span> <span>public</span><span> string GetDatabaseScript(ServerConnection serverConnection, string databaseName)
  514. </span><span>514</span> <span> {
  515. </span><span>515</span> string input <span>=</span><span> string.Empty;
  516. </span><span>516</span> <span> try
  517. </span><span>517</span> <span> {
  518. </span><span>518</span> IServer offlineDatabase <span>=</span><span> InternalUIHooks.GetOfflineDatabase(serverConnection, databaseName);
  519. </span><span>519</span> PrepareDeploymentScriptStep prepareDeploymentScriptStep <span>=</span><span> new PrepareDeploymentScriptStep(offlineDatabase, databaseName, new TargetEngineInfo(serverConnection), true);
  520. </span><span>520</span> prepareDeploymentScriptStep.<span>Execute</span><span>();
  521. </span><span>521</span> input <span>=</span><span> prepareDeploymentScriptStep.CompleteDatabaseObjectsScript;
  522. </span><span>522</span> <span> }
  523. </span><span>523</span> <span> catch (Exception exception)
  524. </span><span>524</span> <span> {
  525. </span><span>525</span> <span> InternalUIHooks.ThrowExceptionMessage(exception);
  526. </span><span>526</span> <span> }
  527. </span><span>527</span> Regex regex <span>=</span> new Regex("<span>^</span><span>RAISERROR</span>.<span>*</span>\\nGO.<span>*</span><span>\\n", RegexOptions.Multiline);
  528. </span><span>528</span> <span>return</span> regex.<span>Replace</span><span>(input, Environment.NewLine);
  529. </span><span>529</span> <span> }
  530. </span><span>530</span> <span>public</span><span> void Apply(ServerConnection serverConnection, string sql, string databaseName)
  531. </span><span>531</span> <span> {
  532. </span><span>532</span> <span>Database</span> <span>database</span> <span>=</span> new Server(serverConnection).Databases<span>[</span><span>databaseName</span><span>]</span><span>;
  533. </span><span>533</span> <span> try
  534. </span><span>534</span> <span> {
  535. </span><span>535</span> string <span>text</span> <span>=</span><span> "Dac";
  536. </span><span>536</span> DacStore dacStore <span>=</span><span> new DacStore(serverConnection);
  537. </span><span>537</span> DacDefinition dacDefinition <span>=</span> new DacDefinition(dacStore, <span>text</span><span>, databaseName);
  538. </span><span>538</span> <span>if</span><span> (!dacDefinition.IsRegistered)
  539. </span><span>539</span> <span> {
  540. </span><span>540</span> <span>text</span> <span>=</span><span> "Dac";
  541. </span><span>541</span> <span> dacDefinition.Register();
  542. </span><span>542</span> <span> }
  543. </span><span>543</span> <span>else</span>
  544. <span>544</span> <span> {
  545. </span><span>545</span> <span>text</span> <span>=</span> dacStore.DacInstances<span>[</span><span>databaseName</span><span>]</span><span>.Type.Name;
  546. </span><span>546</span> <span> }
  547. </span><span>547</span> DacCompilationUnit dacCompilationUnit <span>=</span> new DacCompilationUnit(<span>text</span>, new Version(<span>1</span>, <span>0</span>), <span>database</span><span>.Collation);
  548. </span><span>548</span> <span> dacCompilationUnit.AddTSqlSourceFile("input.sql", sql);
  549. </span><span>549</span> DacCompilationResult dacCompilationResult <span>=</span><span> dacCompilationUnit.Compile();
  550. </span><span>550</span> <span>if</span> (dacCompilationResult.Errors.<span>Count</span><span><</span>DacCompilationError<span>></span>() <span>></span> <span>0</span><span>)
  551. </span><span>551</span> <span> {
  552. </span><span>552</span> StringBuilder stringBuilder <span>=</span><span> new StringBuilder();
  553. </span><span>553</span> foreach (DacCompilationError <span>current</span> <span>in</span><span> dacCompilationResult.Errors)
  554. </span><span>554</span> <span> {
  555. </span><span>555</span> stringBuilder.Append(<span>current</span><span>.Message);
  556. </span><span>556</span> <span> }
  557. </span><span>557</span> <span> throw new Exception(stringBuilder.ToString());
  558. </span><span>558</span> <span> }
  559. </span><span>559</span> DacType dacType <span>=</span><span> dacCompilationResult.DacType;
  560. </span><span>560</span> IServer offlineDatabase <span>=</span><span> InternalUIHooks.GetOfflineDatabase(serverConnection, databaseName);
  561. </span><span>561</span> this.OnModelUpdate(this.GetChangeResultOutput(offlineDatabase.Databases<span>[</span><span>databaseName</span><span>]</span>, dacType.Definition.Databases<span>[</span><span>text</span><span>]</span><span>));
  562. </span><span>562</span> <span> this.OnScriptUpdate(dacStore.GetIncrementalUpgradeScript(databaseName, dacType));
  563. </span><span>563</span> <span> dacStore.IncrementalUpgrade(databaseName, dacType, new DacUpgradeOptions());
  564. </span><span>564</span> <span> }
  565. </span><span>565</span> <span> catch (Exception exception)
  566. </span><span>566</span> <span> {
  567. </span><span>567</span> <span> InternalUIHooks.ThrowExceptionMessage(exception);
  568. </span><span>568</span> <span> }
  569. </span><span>569</span> <span> }
  570. </span><span>570</span> <span> private string GetChangeResultOutput(IDatabase sourceDatabase, IDatabase targetDatabase)
  571. </span><span>571</span> <span> {
  572. </span><span>572</span> ChangeResult changeResult <span>=</span><span> Differencer.Compare(sourceDatabase, targetDatabase, this.GetDefaultDifferencerFilter());
  573. </span><span>573</span> StringBuilder stringBuilder <span>=</span><span> new StringBuilder();
  574. </span><span>574</span> using (XmlWriter xmlWriter <span>=</span> XmlWriter.<span>Create</span><span>(stringBuilder, new XmlWriterSettings
  575. </span><span>575</span> <span> {
  576. </span><span>576</span> Indent <span>=</span><span> true,
  577. </span><span>577</span> IndentChars <span>=</span><span> " ",
  578. </span><span>578</span> NewLineChars <span>=</span><span> Environment.NewLine,
  579. </span><span>579</span> CloseOutput <span>=</span><span> false
  580. </span><span>580</span> <span> }))
  581. </span><span>581</span> <span> {
  582. </span><span>582</span> <span> InternalUIHooks.DifferencerTestUtils.WriteChangeResult(xmlWriter, changeResult);
  583. </span><span>583</span> <span> }
  584. </span><span>584</span> <span>return</span><span> stringBuilder.ToString();
  585. </span><span>585</span> <span> }
  586. </span><span>586</span> <span> private static void ThrowExceptionMessage(Exception exception)
  587. </span><span>587</span> <span> {
  588. </span><span>588</span> StringBuilder stringBuilder <span>=</span><span> new StringBuilder();
  589. </span><span>589</span> <span>while</span> (exception <span>!=</span> <span>null</span><span>)
  590. </span><span>590</span> <span> {
  591. </span><span>591</span> stringBuilder.AppendLine("<span>-></span>" <span>+</span><span> exception.Message);
  592. </span><span>592</span> exception <span>=</span><span> exception.InnerException;
  593. </span><span>593</span> <span> }
  594. </span><span>594</span> <span> throw new Exception(string<scri <="" div="">
  595. <div class="">
  596. <ul class="m-news-opt fix">
  597. <li class="opt-item">
  598. <a href="/mysql-343131.html" target="_blank"><p>< 上一篇</p><p class="ellipsis">sqlserver触发器引起的死锁问题</p></a>
  599. </li>
  600. <li class="opt-item ta-r">
  601. <a href="/mysql-343133.html" target="_blank"><p>下一篇 ></p><p class="ellipsis">SQLSERVER中的网络配置</p></a>
  602. </li>
  603. </ul>
  604. </div>
  605. </scri></span>

人气教程排行