2009-05-27 8 views
3

DBのSQLスキーマ全体を作成してから、そのハッシュを生成したいと思います。これは、ロールバックスクリプトがスキーマを元の状態に戻すかどうかを確認できるようにするためです。私が使用できるSPやその他の狡猾な方法はありますか?私はそれができるだけ速くなるようにしたいと思います。スクリプト生成の最速方法ハッシュのためのSQLサーバーのDBスキーマ

+0

1:2005/2008、 2:いや、 3: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

申し訳ありませんMatt、LinqPadで試しました。これは、db自体をスクリプトするようですが、スキーマやその他のオブジェクトはテーブルではありません。 また、sb.GetHashCode()は、私が考える現在のAppDomainで機能するハッシュ値です。これは、値のハッシュではなく、stringbuilderのメモリ位置を返します。次回にアプリケーションを実行すると、コードは異なります。新しいStringBuilder( "Hello")。GetHashCode()!=新しいStringBuilder( "Hello")。GetHashCode() – mcintyre321

+0

あなたは正しいです。私は前に同じミスをしました。たぶん私はこの時間を学んだでしょう。私はコードを編集しました。うまくいけば、これはもっと近いです。空白の問題があり、細部が何が求められているかを正確に判断することができますが、これはより近づくはずです。 –

0

SMOscriptというツールを書いて、SMOライブラリ呼び出しを使用してデータベース内のすべてのオブジェクトをスクリプト化しました。これを使用して単一の.sqlファイルを作成し、結果ファイルのハッシュを計算する別のツールを見つけることができます。 (無作為なgoogleは例えばthisを持ち出す)

+0

悪くないためのthats。 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

関連する問題