在SQL Server中存储数据库架构版本的最佳实践?

2022-06-06 00:00:00 database-schema sql-server

我有一个将部署在安装了SQL Server的生产PC上的应用程序。 我希望能够在我的数据库中存储和检索模式的一个版本。 我对能够实现这一目标的最佳实践感兴趣,主要目标如下:

  1. 能够存储和轻松检索数据库的版本号。
  2. 隐藏或更难被客户端找到和操作。
  3. 创建新版本时能够编辑/更改。
  4. 备份数据库或分离数据库将保留版本号以供取证。

我希望有一种方法可以将"版本"存储在元数据中,而不是存储在普通表中,后者可以通过系统存储过程访问/设置。

有什么想法或最佳实践吗?

编辑:我发现的一个可能很有前途的选择是使用SQL Server扩展属性,将分配给数据库的键|值与"SCHEMA_VERSION"和版本号放在一起。它没有加密(但它的值可能是加密的),也没有隐藏,但至少从我们的一些用户和现场人员浏览的实际DB结构中删除了(令我沮丧!:))


解决方案

我是Red Gate的SQL源代码管理和SQL比较的产品经理。我们必须解决这个问题,因为我们的工具需要知道数据库的版本,以便选择适当的迁移脚本来构建完整的部署脚本。

我们考虑了版本表,这是最常见的自行设计的解决方案。然而,从我们的研究中我们了解到,用户希望保持数据库对象集‘不受污染’,因此我们选择了数据库级扩展属性。我们将其附加到脚本中,如下所示:

IF EXISTS (SELECT 1 FROM fn_listextendedproperty(N'SQLSourceControl Database Revision', NULL, NULL, NULL, NULL, NULL, NULL))
  EXEC sp_dropextendedproperty N'SQLSourceControl Database Revision', NULL, NULL, NULL, NULL, NULL, NULL
EXEC sp_addextendedproperty N'SQLSourceControl Database Revision', @RG_SC_VERSION, NULL, NULL, NULL, NULL, NULL, NULL

将数据库加载到SQL Compare中时,它会执行检查,以确保它声称的版本与源代码管理中存储的版本相对应。

希望这能有所帮助!

相关文章