2008-12-29 82 views
4

我們有一個數據庫(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

,而不是引發錯誤,插入可能只是默默地改變爲更新。 – 2008-12-29 23:11:16

回答

7

使用觸發器。

+0

觸發器也是我的第一個想法。在插入看看條目是否存在,只是失敗,或理想情況下使用存儲的過程執行更新。 – Adam 2008-12-29 22:19:17

+0

我實際上最終使用了這種方法。也許你可以改變你的答案,儘管有更多的細節?會有幫助。 – 2008-12-29 23:02:36

1

根本不是。你可以簡單地添加其他,升列於表(日期,身份證,等等),然後遞減順序由另一列的查詢和結果限制爲1行:

SELECT v.version FROM version v ORDER by v.date DESC LIMIT 1; 

這樣,你甚至可以得到一個每個版本何時到達的歷史。

編輯:

上面的SQL查詢不會在SQL Server上運行,因爲它不支持LIMIT聲明。人們將不得不規避這種不足,可能如此"All Things SQL Server" blog entry中所述。

+0

LIMIT不是SQL Server – 2008-12-29 23:16:44

+0

我不知道這一點。謝謝。 – Ole 2008-12-30 00:10:23

+0

SELECT TOP 1 v.version從V版本v ORDER通過v.date DESC – recursive 2008-12-30 01:22:13

6

概括表舉辦的「設置」,並使其成爲一個鍵/值對

CREATE TABLE Settings (Key nvarchar(max), Value nvarchar(max)) 

然後作出關鍵唯一索引。

CREATE UNIQUE INDEX SettingsIDX ON Settings (Key) 

這將創建一個具有唯一鍵值對的表,其中一個表可以是Version。

INSERT INTO Settings (Key, Value) VALUES ('Version','1'); 
0

通過創建一個允許原始行作爲數據庫初始化腳本的一部分,(也即腳本)去除插入權限,即表的所有登錄(只更新將被允許)

你也可能要禁止刪除,以及...

1

根據您的意見與其他反應,看來:

  1. 你不希望用戶只需要修改的值。
  2. 你只想要返回一個值。
  3. 該值是靜態的,並且是腳本的。

因此,我可能會建議您編寫一個函數來返回靜態值嗎?由於無論如何您都必須腳本更新版本號,因此在更新數據庫時,只需在腳本中刪除並重新創建函數。

這具有可以從視圖或過程使用的優點,並且由於函數的返回值是隻讀的,所以不能修改(不修改函數)。

編輯:您也不必擔心將表格限制爲一行的複雜解決方案。

只是一個建議。

1

保留數據庫的版本號是非常重要的。不過,我更願意擁有一個版本表,其中可以包含多行,其中包含版本號字段,更新發生的時間以及執行升級的用戶。

這樣你就知道哪些升級腳本已經運行,並且可以很容易地看到它們是否已經失效。

當您想讀取當前版本號時,您可以閱讀最近的記錄。

如果您只存儲一條記錄,則知道腳本是否已被遺漏。如果你想變得非常聰明,你可以在你的升級腳本中加入檢查,這樣它們將不會運行,除非以前版本的數據庫是正確的。

2

您可以使用喬·塞科的默認+主+檢查技術:

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

相關問題