首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成脚本的最快方法SQL server DB schema for hashing

生成脚本的最快方法SQL server DB schema for hashing
EN

Stack Overflow用户
提问于 2009-05-27 10:53:34
回答 3查看 2.1K关注 0票数 4

我想为DB生成整个SQL模式,然后生成它的散列。这是为了检查回滚脚本是否将模式返回到其原始状态。有没有我可以使用的SP或其他一些巧妙的方法?我希望它越快越好。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-27 11:56:37

下面的代码应该可以工作:

代码语言:javascript
复制
        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()));
票数 2
EN

Stack Overflow用户

发布于 2009-05-27 11:56:10

如果将表和键与代码和约束分开,则可以很容易地对后者进行散列。

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2009-05-27 11:10:14

我编写了一个名为SMOscript的工具,它使用SMO库调用来编写数据库中所有对象的脚本。您可以使用它来创建一个.sql文件,并找到另一个工具来计算结果文件的散列。(随机谷歌以this为例)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/915109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档