2009-05-27 4 views
3

Я хотел бы выделить всю схему SQL для БД, а затем создать хэш из нее. Это так, что я могу проверить, возвращает ли скрипт отката схему в исходное состояние. Есть ли СП, который я могу использовать, или какой-нибудь другой хитрый метод? Я бы хотел, чтобы это было как можно быстрее.Самый быстрый способ генерации скриптов SQL-схема DB для хеширования

+0

1: 2005/2008, 2: Нет, 3: Thats для V2 :) – mcintyre321

ответ

2

Следующие должны работать:

 Microsoft.SqlServer.Management.Smo.Server srv = new Microsoft.SqlServer.Management.Smo.Server("Server"); 

     Microsoft.SqlServer.Management.Smo.Database db = srv.Databases["DB_Name"]; 

     // Set scripting options as needed using a ScriptingOptions object. 
     Microsoft.SqlServer.Management.Smo.ScriptingOptions so = new ScriptingOptions(); 
     so.AllowSystemObjects = false; 
     so.ScriptDrops = false; 
     so.Indexes = true; 
     so.ClusteredIndexes = true; 
     so.PrimaryObject = true; 
     so.SchemaQualify = true; 
     so.IncludeIfNotExists = false; 
     so.Triggers = true; 

     System.Collections.Specialized.StringCollection sc = new System.Collections.Specialized.StringCollection(); 
     StringBuilder sb = new StringBuilder(); 

     foreach (Table item in db.Tables) 
      if (!item.IsSystemObject) 
      { 
       sc = item.Script(so); 
       foreach (string s in sc) 
        sb.Append(s); 
      } 

     foreach (StoredProcedure item in db.StoredProcedures) 
      if (!item.IsSystemObject) 
       if (!item.IsSystemObject) 
       { 
        sc = item.Script(so); 
        foreach (string s in sc) 
         sb.Append(s); 
       } 

     foreach (UserDefinedFunction item in db.UserDefinedFunctions) 
      if (!item.IsSystemObject) 
       if (!item.IsSystemObject) 
       { 
        sc = item.Script(so); 
        foreach (string s in sc) 
         sb.Append(s); 
       } 

     foreach (Trigger item in db.Triggers) 
      if (!item.IsSystemObject) 
       if (!item.IsSystemObject) 
       { 
        sc = item.Script(so); 
        foreach (string s in sc) 
         sb.Append(s); 
       } 


     //sb.GetHashCode(); 
     // For a better hash do this. 
     System.Security.Cryptography.MD5CryptoServiceProvider hashProvider = new System.Security.Cryptography.MD5CryptoServiceProvider(); 

     byte[] hashData = hashProvider.ComputeHash(ASCIIEncoding.ASCII.GetBytes(sb.ToString())); 
+0

Жаль, Мэтт, просто попробовал это в LinqPad. Кажется, скрипт сам db, но не схемы таблиц или другие объекты. Кроме того, sb.GetHashCode() является только хэш-значением, которое работает для текущего AppDomain, я думаю! Он возвращает местоположение памяти строкового конструктора, а не хэш его значения, поэтому в следующий раз, когда вы запустите приложение, код будет другим. new StringBuilder («Hello»). GetHashCode()! = new StringBuilder («Hello»). GetHashCode() – mcintyre321

+0

Вы правы. Я сделал ту же ошибку раньше. Возможно, я узнал это время. Я заставил изменить код. Надеюсь, это ближе. По-прежнему существует проблема с пробелами и точно определяется, какие детали нужны, но это должно быть ближе. –

0

Я написал инструмент под названием SMOscript, который использует вызовы библиотеки SMO ​​для сценария всех объектов в базе данных. Вы можете использовать его для создания одного файла .sql и найти другой инструмент для вычисления хеша в файле результатов. (например, случайный google поднимает this)

+0

не плохо. SMO немного медленнее для моего удовольствия. Вероятно, с помощью OpenDbDiff можно сделать что-то похожее, поскольку кажется, что у меня нет одного вызова SP, который я могу использовать. – mcintyre321

2

Если вы отделите таблицы и ключи от кода и ограничений, то вы можете легко его использовать.

SELECT 
    CHECKSUM_AGG(BINARY_CHECKSUM (*)) 
FROM 
    (SELECT 
     definition 
    FROM 
     sys.default_constraints 
    UNION ALL 
    SELECT 
     definition 
    FROM 
     sys.sql_modules 
    UNION ALL 
    SELECT 
     definition 
    FROM 
     sys.check_constraints 
    ) foo 
+0

Мне нужны хэши столов, sprocs, ограничения все, что я боюсь! – mcintyre321

+0

Итак, неполный ответ -1? Учитывая, что вы уже написали инструмент http://stackoverflow.com/questions/6371/how-do-you-manage-databases-in-development-test-and-production/541419#541419, почему вы задали вопрос ? – gbn

Смежные вопросы