我需要将版本放到 SQL Server 2005 数据库中,并从 .NET 应用程序中访问这些版本。我在想的是在数据库上使用名称为“版本”的扩展属性,当然该值将是数据库的版本。然后我可以使用 SQL 来解决这个问题。我的问题是这听起来像是一个好计划还是有更好的方法将版本添加到 SQL Server 数据库?
假设我无法使用表格来保存元数据。
我需要将版本放到 SQL Server 2005 数据库中,并从 .NET 应用程序中访问这些版本。我在想的是在数据库上使用名称为“版本”的扩展属性,当然该值将是数据库的版本。然后我可以使用 SQL 来解决这个问题。我的问题是这听起来像是一个好计划还是有更好的方法将版本添加到 SQL Server 数据库?
假设我无法使用表格来保存元数据。
我这样做:
创建模式表:
CREATE TABLE [dbo].[SchemaVersion](
[Major] [int] NOT NULL,
[Minor] [int] NOT NULL,
[Build] [int] NOT NULL,
[Revision] [int] NOT NULL,
[Applied] [datetime] NOT NULL,
[Comment] [text] NULL)
更新架构:
INSERT INTO SchemaVersion(Major, Minor, Build, Revision, Applied, Comment)
VALUES (1, 9, 1, 0, getdate(), 'Add Table to track pay status')
获取数据库架构版本:
SELECT TOP 1 Major, Minor, Build from SchemaVersion
ORDER BY Major DESC, Minor DESC, Build DESC, Revision DESC
改编自我在Coding Horror上读到的内容
我们使用您描述的扩展属性,它工作得非常好。
我认为有一张桌子是矫枉过正的。如果我想跟踪我的数据库中的差异,我会使用源代码控制并将所有数据库生成脚本保存在其中。
我还使用了一些 ER 图工具来帮助我跟踪数据库版本的变化。这超出了实际应用程序,但它让我可以快速看到发生了什么变化。
我认为是 CASEStudio 或类似的东西。
如果我正确理解您的问题(区分内部数据库版本,例如应用程序内部版本号),您可以拥有某种 SYSVERSION 表,其中包含包含此信息的单行数据。
更容易查询。
还可以包含多列有用信息,或代表数据库副本升级的不同时间的多行。
更新:好吧,如果您不能使用表来保存元数据,那么某种外部信息(硬盘驱动器上的 INFO 文件?)或扩展属性将是可行的方法。
不过,我仍然喜欢 table 的想法:) 你总是可以使用安全性来使其只能通过自定义存储的 proc get_ db_version 或其他东西访问。
最好的方法是有两个过程:一个标题来控制要插入的内容和验证一个页脚来插入数据,如果发布是好的与否。正文将包含您的脚本。
您需要一个包装器来封装您的脚本并记录所有信息:到目前为止,已应用脚本编号、applyby、applydate 日期、发布结果“失败或成功”。
我正在使用类似于马特解决方案的专用表。除此之外,数据库更改必须在对架构应用任何更改之前检查当前版本。如果当前版本小于预期,则脚本以致命错误终止。如果当前版本大于预期,则脚本会跳过当前步骤,因为该步骤过去有时已经执行过。
这是编写数据库更改脚本的示例和约定的完整解决方案:如何维护 SQL Server 数据库架构版本