我需要在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文件?),要么使用扩展属性。
尽管如此,我仍然喜欢桌子的想法 :) 您可以始终使用安全性,仅通过自定义存储过程 get_db_version 或其他方式使其可访问。
最好的方法是有两个程序:一个标题来控制什么正在插入和验证,一个页脚来插入数据,如果发布好或不好。正文将包含您的脚本。
您需要一个包装器,它将封装您的脚本并记录所有信息:发布情况、所应用的脚本编号、应用者、应用日期、发布结果“失败或成功”。
我使用类似Matt解决方案的专用表。此外,数据库更改必须在应用任何模式更改之前检查当前版本。如果当前版本小于预期,则脚本将以致命错误终止。如果当前版本大于预期,则脚本将跳过当前步骤,因为该步骤有时已经执行过。
这里有完整的解决方案,包括编写数据库更改脚本的示例和惯例:如何维护SQL Server数据库架构版本。