Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建和编辑数据库结构的方法是什么:代码还是脚本?_C#_Sql Server_Database - Fatal编程技术网

C# 创建和编辑数据库结构的方法是什么:代码还是脚本?

C# 创建和编辑数据库结构的方法是什么:代码还是脚本?,c#,sql-server,database,C#,Sql Server,Database,假设有一个应用程序,它应该在主数据库中创建自己的表(例如,应用程序第一次运行)。哪种方法更灵活、更可扩展,更适合商业产品 如果我编写了所有代码,就不需要额外的文件(脚本)。用户将无法用它们做一些愚蠢的事情,然后抱怨应用程序无法工作。但当数据库结构发生变化时,我必须对补丁部分进行编码,用户必须安装新的二进制文件(或者只是替换旧的) 脚本解决方案是只运行一些目录和一堆脚本中的所有脚本的几行代码。二进制可以是相同的,补丁将自动应用。但新脚本也必须在某个时候部署给用户 那么,你有什么建议 应用程序将在c

假设有一个应用程序,它应该在主数据库中创建自己的表(例如,应用程序第一次运行)。哪种方法更灵活、更可扩展,更适合商业产品

如果我编写了所有代码,就不需要额外的文件(脚本)。用户将无法用它们做一些愚蠢的事情,然后抱怨应用程序无法工作。但当数据库结构发生变化时,我必须对补丁部分进行编码,用户必须安装新的二进制文件(或者只是替换旧的)

脚本解决方案是只运行一些目录和一堆脚本中的所有脚本的几行代码。二进制可以是相同的,补丁将自动应用。但新脚本也必须在某个时候部署给用户

那么,你有什么建议

应用程序将在c#中编码,数据库目前将在SQLServer2005下,但将来可能会更改。当然,绘图应用程序和数据库处理部分可以分为两个二进制文件/程序集,但这并不能解决我的代码与脚本之间的矛盾。

检查:它提供了一种特殊的语言(有点接近SQL DDL)来表达对数据库模式的更改:

migration "Blog" revision => 1:
    type-aliases:
        type-alias N type => String, length => 200, nullable => false, default => ""

    defaults:
        default-primary-key ID type => Int32, nullable => false, identity => true

    version 20090226100407:
        add table Author: /* Primary Key is added automatically */
            FirstName type => N /* “add” can be omitted */
            LastName type => N
            EmailAddress type => N, unique => true /* "unique => true" will create UQ_EmailAddress index */
            Login type => N, unique => true
            Password type => Binary, length => 64, nullable => true

            index UQ_LoginEmailAddress unique => true, columns => [[Login, asc], EmailAddress]

        add table Tag:
            Name type => N

        add table Blog:
            Name type => N
            Description type => String, nullable => false

        add table BlogPost:
            Title type => N
            Slug type => N
            BlogID references => Blog /* Column type is inferred automatically */
            AuthorID: 
                reference pk-table => Author
这些
version
块基本上是要应用于数据库架构的更改

Wizardby还可以集成到构建过程以及应用程序中:中的每个启动都可以尝试将数据库升级到最新版本。因此,您的应用程序将始终使用最新的模式版本


它还可以集成到您的安装过程中:Wizardby可以生成SQL脚本来更改数据库架构,这些脚本可以作为安装过程的一部分运行。

我通常希望将安装代码与应用程序代码分开。您肯定希望应用程序对数据库执行某种版本检查,以确保它在运行之前具有所需的正确结构。我将遵循以下基本设置:

  • 对每个已发布的脚本使用脚本 要对其进行架构更改的版本 部署的数据库

  • 在您的数据库中有跟踪当前版本的 数据库,也许是一个简单的版本 表,该表跟踪哪些脚本具有 我们一直在反对它。更简单 要查找版本脚本,请执行以下操作: 要每次检查架构,请执行以下操作: 搜索所有表和字段 你需要

  • 让应用程序检查数据库版本标记以确保 符合应用程序的版本。 记录一个错误,该错误将允许用户 知道他们必须更新他们的 使用数据库脚本创建数据库


  • 这将保持应用程序代码的整洁,但要确保数据库和应用程序同步。

    然后使用DBGhost或之类的版本控制工具将帮助您维护数据库更新,并可以进行修改以无缝地适应应用程序。

    我考虑过存储在数据库中的“上次应用的版本”,但为什么脚本不编码?我可以检查数据库版本,运行修补代码以及运行脚本。如果AppV4使用了一个新表,我必须将该表添加到db中,但是,同样,为什么要通过脚本而不是代码?正如我在开始时提到的,我个人的偏好是尽量使安装代码远离我的应用程序代码。这并不是说您不能从代码中运行脚本,或者让代码进行更改,而是说将其放入应用程序业务层会污染它。如果您更喜欢使用代码而不是发布脚本进行数据库更改,则可以始终创建一个单独的“版本控制”应用程序,以确保数据库正确升级到所需版本。这将分离这两个应用程序概念,同时不会强迫您使用脚本。这是对代码而不是脚本的投票吗?它看起来很有趣,因为我可以使用SMO编写这样的机制。