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