如何在SQL中更新记录绕过NHibernate版本控制

时间:2017-03-21 08:04:11

标签: c# sql nhibernate proxy

假设我有一个timestamp列的表格,通过NHibernate来管理记录版本,现在我正在寻找更新数据记录的方法没有增加ts列的值,因为你知道在每个更新语句之后值会增加以跟踪数据版本以避免并发问题。

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]

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

  

有什么想法吗?

根据您的评论和架构driver = webdriver.Chrome(executable_path=r'C:/Python27/Scripts/chromedriver.exe') ts。所以它会在每次更新操作时被修改。

一种方法是使用[ts] [timestamp] NOT NULL触发器并撤消修改发生。但你为什么要那样做?此外,MySQL中不支持触发同一个表(或)递归触发器。

答案 1 :(得分:1)

如果某些列不应受timestamp跟踪,那么您可以将这些列移动到新表中,然后再引用该原始表。

如果需要,您可以隐藏此新表和修改后的原始表的存在,然后生成一个名为TSTest的视图,将表连接在一起(与应用插入,更新和删除的触发器一起)到适当的基表)。

然而,在这种情况下,我们不应该清楚我们应该做什么,因为只有一个明显的可以更新的"专栏 - Name - 如果我们不希望它受到timestamp跟踪的影响,我们就不清楚为什么我们会在这张桌子上进行跟踪。

不幸的是,没有其他T-SQL机制来避免timestamp的行为 - 这通常被视为一件好事。您无法通过触发器执行任何操作,因为如果您实际触摸基表,timestamp将会更改,并且您不允许UPDATE时间戳列,以便您可以&#39 ;甚至在改变后重置它。

  

我认为这是可能的,软件中没有什么是不可能的

暂且不谈停止问题这样的事情,你当然可以解决这个问题可以解决的问题 - 但不是对你有用的方式。正如我上面所说,通过T-SQL无法实现。

如果确实需要这样做,那么您可以通过直接操作数据库文件来实现。当然,这需要您分离数据库或关闭服务器,然后通过文件结构来手动定位包含您想要更改的行的页面,然后应用这些更改然后更正结构的其他部分(例如页面校验和),以便SQL Server不相信页面现在已损坏。

我并没有真正提倡这种方法,只是概述了你必须实际执行你所要求的正常程度。