我们有一个数据库(SQL Server 2005),我们希望在源代码管理下获得它。作为其中的一部分,我们将有一个版本表来存储数据库的当前版本号。有没有办法将该表限制为只保留一行?或者将版本号存储在表中是个坏主意?
结束使用这种方法:
CREATE TABLE [dbo].[DatabaseVersion]
(
[MajorVersionNumber] [int] NOT NULL,
[MinorVersionNumber] [int] NOT NULL,
[RevisionNumber] [int] NOT NULL
)
GO
Insert DataBaseVersion (MajorVersionNumber, MinorVersionNumber, RevisionNumber) values (0, 0, 0)
GO
CREATE TRIGGER DataBaseVersion_Prevent_Delete
ON DataBaseVersion INSTEAD OF DELETE
AS
BEGIN
RAISERROR ('DatabaseVersion must always have one Row. (source = INSTEAD OF DELETE)', 16, 1)
END
GO
CREATE TRIGGER DataBaseVersion_Prevent_Insert
ON DataBaseVersion INSTEAD OF INSERT
AS
BEGIN
RAISERROR ('DatabaseVersion must always have one Row. (source = INSTEAD OF INSERT)', 16, 1)
END
GO
答案 0 :(得分:7)
使用触发器。
答案 1 :(得分:6)
对表格进行概括以保持“设置”并使其成为键/值对
CREATE TABLE Settings (Key nvarchar(max), Value nvarchar(max))
然后在Key上创建一个唯一索引。
CREATE UNIQUE INDEX SettingsIDX ON Settings (Key)
这将创建一个具有唯一键值对的表,其中一个可以是Version。
INSERT INTO Settings (Key, Value) VALUES ('Version','1');
答案 2 :(得分:2)
您可以使用Joe Celko的默认+主要+检查技巧:
create table database_version (
lock char(1) primary key default 'x' check (lock='x'),
major_version_number int NOT NULL,
minor_version_number int NOT NULL,
revision_number int NOT NULL
);
用它来
答案 3 :(得分:1)
完全没有。您可以简单地向该表添加另一个升序列(日期,id,无论如何),然后按顺序将该查询按其他列排序并将结果限制为1行:
SELECT v.version FROM version v ORDER by v.date DESC LIMIT 1;
这样您甚至可以获得每个版本到达时间的历史记录。
编辑:
上述sql查询在SQL Server上不起作用,因为它不支持LIMIT语句。人们不得不规避这种不足,可能如本"All Things SQL Server" blog entry所述。
答案 4 :(得分:1)
根据您对其他回复的评论,似乎:
那么,我可以建议您编写一个返回静态值的函数吗?由于您无论如何都必须编写版本号的更新脚本,因此您只需在更新数据库时删除并重新创建脚本中的函数。
这具有可从视图或过程中使用的优点,并且由于函数的返回值是只读的,因此无法修改(不修改函数)。
编辑:您也不必担心将表限制为一行的复杂解决方案。
只是一个建议。
答案 5 :(得分:1)
保留数据库的版本号是完全合理的。但是,我更喜欢有一个Version表,它可以包含多行,其中包含版本号字段,更新发生的时间以及执行升级的用户。
通过这种方式,您可以了解哪些升级脚本已运行,并且可以轻松查看它们是否已按顺序运行。
当您想要阅读当前的版本号时,您只需阅读最新的记录。
如果您只存储一条记录,则您知道如何错过脚本。如果你想要非常聪明,你可以在升级脚本中加入检查,这样它们就不会运行,除非以前版本的数据库是正确的。
答案 6 :(得分:0)
通过创建一个允许的原始行作为数据库初始化脚本的一部分,并且(也在该脚本中)删除对该表的所有登录的插入权限(仅允许更新)
你可能也想要禁止删除......