2017-03-21 61 views
1

只是假設我有一個表timestamp列,通過NHibernate管理記錄版本,現在我正在尋找一種方法來更新我的數據記錄沒有增加ts列的值,因爲你知道每個更新語句後值會增加以跟蹤數據版本以避免併發問題。如何更新SQL中的記錄,繞過NHibernate版本控制

CREATE TABLE [dbo].[TSTest]( 
    [ID] [int] NOT NULL, 
    [Name] [nvarchar](50) NULL, 
    [ts] [timestamp] NOT NULL, 
    CONSTRAINT [PK_TSTest] PRIMARY KEY CLUSTERED ([ID] ASC) 
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

任何想法?

+0

不,你不能。 –

+0

我認爲這是可能的,軟件中沒有什麼是不可能的! –

+0

感謝您編輯@Serg –

回答

1

如果有某些列不應該受到timestamp跟蹤,那麼您可以將這些列移動到一個新表中,然後再引用這個原始表。

如果需要,您可以隱藏這個新表的存在,並從應用程序到那時產生一個名爲TSTest觀點與應用插入,更新觸發器一起加入表一起(並刪除到適當的修改後的原始表基表)。

然而,在這種情況目前還不清楚,我們應該做些什麼,因爲這裏只有一個明顯的「更新」一欄 - Name - 因此,如果我們不希望它受到timestamp跟蹤,目前還不清楚爲什麼我們會有這樣的事桌子。

不幸的是,沒有其他T-SQL機制可以避免timestamp的行爲 - 而這通常被視爲一件好事。您無法通過觸發器執行任何操作,因爲如果實際觸摸了基表,timestamp將會更改,並且您不允許使用UPDATE時間戳列,因此在更改後您甚至不能重置它。

我認爲這是可能的,沒有什麼是軟件

撇開事情好像停機問題的存在是不可能的,你當然是正確的,這個問題可以來解決 - 但不是對你有用的方式。正如我上面所說,通過T-SQL是不可能的。

如果你真的需要做到這一點,那麼你可以通過直接操作數據庫文件來做到這一點。當然,這需要您分離數據庫或關閉服務器,然後通過文件結構進行分解以手動找到包含要更改的行的頁面,然後應用這些更改,然後進行更正結構的其他部分(如頁面校驗和),以便SQL Server不相信頁面現在已損壞。

我並不是真的提倡這種方法,只是概述了離正常情況有多遠,你不得不去實際執行你要求的東西。

+0

我喜歡你的回答是因爲你的廣泛意見來解決這個問題,只是爲了你的信息,這個表模式只是爲了測試我的原始表是另一個,順便說一下我對你感興趣的第二個解決方案,推薦我使用View,我認爲它將爲我的情況工作,謝謝我的朋友:) –

0

任何想法?

根據您的評論和架構您的ts[ts] [timestamp] NOT NULL。所以它會在每個更新操作中被修改。

一種方法可能是使用AFTER UPDATE觸發器並撤銷發生的修改。但是,你爲什麼要這樣做?而且,MySQL中不支持在同一個表(或)遞歸觸發器上觸發。

+0

CREATE TABLE [DBO]。[TSTest( \t [ID] [INT] NOT NULL, \t [名] [爲nvarchar(50)NULL, \t [TS] [時間戳] NOT NULL, 約束[PK_TSTest] PRIMARY KEY CLUSTERED ( \t [ID] ASC )WITH(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY] )ON [PRIMARY] –

+0

不,這是'時間戳'(又名'rowversion')列,*不是*日期時間。所以提及'current_timestamp'和觸發器是一個紅鯡魚。 –

+0

@MohammadNikravesh - 當人們要求模式(通常是作爲評論而不是答案)時,通常最好*編輯*您的問題,以便您可以將塊標記爲代碼('{}'),以便它*可讀*,不像評論。 (當然,理想情況下,我們不需要詢問架構,從一開始就會出現在你的問題中) –