你能限制(数据库)表中的行数吗?

时间:2008-12-29 21:35:12

标签: sql-server

我们有一个数据库(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

7 个答案:

答案 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
);
用它来

Fiddle

答案 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)

根据您对其他回复的评论,似乎:

  1. 您不希望用户只修改该值。
  2. 您只需要返回一个值。
  3. 该值是静态的,并且是脚本化的。
  4. 那么,我可以建议您编写一个返回静态值的函数吗?由于您无论如何都必须编写版本号的更新脚本,因此您只需在更新数据库时删除并重新创建脚本中的函数。

    这具有可从视图或过程中使用的优点,并且由于函数的返回值是只读的,因此无法修改(不修改函数)。

    编辑:您也不必担心将表限制为一行的复杂解决方案。

    只是一个建议。

答案 5 :(得分:1)

保留数据库的版本号是完全合理的。但是,我更喜欢有一个Version表,它可以包含多行,其中包含版本号字段,更新发生的时间以及执行升级的用户。

通过这种方式,您可以了解哪些升级脚本已运行,并且可以轻松查看它们是否已按顺序运行。

当您想要阅读当前的版本号时,您只需阅读最新的记录。

如果您只存储一条记录,则您知道如何错过脚本。如果你想要非常聪明,你可以在升级脚本中加入检查,这样它们就不会运行,除非以前版本的数据库是正确的。

答案 6 :(得分:0)

通过创建一个允许的原始行作为数据库初始化脚本的一部分,并且(也在该脚本中)删除对该表的所有登录的插入权限(仅允许更新)

你可能也想要禁止删除......