好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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的详细内容...

  阅读:41次