在插入

时间:2017-09-21 13:19:21

标签: tsql

我的表格中有一个名为LastChanged的RowVersion列。

ID | LastChanged | Foo |

我正在开发一些与同步相关的功能。我将从最小和最大RowVersion之间的表中选择所有记录。初始同步将没有Min Row版本,因此我将包括MIN_ACTIVE_ROWVERSION()之前的所有行。

后续同步的最小值为RowVersion - 通常是上一次同步的MIN_ACTIVE_ROWVERSION()

选择Min和Max RowVersion之间的行很容易。但是,我还想确定哪些行是Inserts,哪些行是Updates。对我来说,最简单的方法是添加另一列:

ID | LastChanged(RowVersion)| CreationRowVersion(二进制(8))| Foo |

对于CreationRowVersion - 我们的想法是捕获插入时的RowVersion值。那个值将永远不会改变行。所以我想在最初插入行时将CreationRowVersion默认为与RowVersion相同的值。

有了这个,我应该能够确定哪些行已经创建,以及自上次同步以来哪些行已经更新(即在最小和最大RowVersions之间) - 因为对于创建的行,我可以查看行具有CreationRowVersion的最小和最大行版本范围内的LastChanged。对于更新的行,我可以查看CreationRowVersion落在最小和最大行版本范围内的行 - 但是如果行CreationRowVersion也介于两者之间,我也可以将行排除在“更新”之外最小和最大RowVersions然后我知道它们实际上已经作为插入包含在内。

所以现在背景已经不在了,它让我想到了问题的关键。在插入时将RowVersion默认为RowVersion的最有效方法是什么?这可以通过列上的默认约束来完成,还是必须通过触发器来完成?我希望此列为二进制(8),因为它匹配import { Component } from '@angular/core'; import {Router, NavigationEnd} from "@angular/router"; import {GoogleAnalyticsEventsService} from "./google-analytics-events.service"; declare var ga:Function; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { onSubmit = function(login){ console.log(login); } constructor(public router: Router, public googleAnalyticsEventsService: GoogleAnalyticsEventsService) { this.router.events.subscribe(event => { if (event instanceof NavigationEnd) { ga('set', 'page', event.urlAfterRedirects); ga('send', 'pageview'); } }); } submitEvent() { this.googleAnalyticsEventsService.emitEvent("testCategory", "testAction", "testLabel", 10); } } 的数据类型。

由于

2 个答案:

答案 0 :(得分:1)

在默认语句中有一个关于引用列的existing question。你不能这样做,但还有其他建议要看,包括AFTER INSERT触发器。

您可能希望在RowVersion and Performance上查看此问题。

答案 1 :(得分:1)

尝试使用MIN_ACTIVE_ROWVERSION()功能作为System.ArgumentException: 'Conversion failed when converting the varchar value 'F_isdeleted' to data type int.' 列的默认值。

CreationRowVersion BINARY(8)

注意:在我的测试中,以上仅适用于一次插入一行的情况。以下方案的代码似乎不适用于您的用例:

CREATE TABLE dbo.RowVerTest (
    ID INT IDENTITY,
    LastChanged ROWVERSION,
    CreationRowVersion BINARY(8)
        CONSTRAINT DF_RowVerTest_CreationRowVersion DEFAULT(MIN_ACTIVE_ROWVERSION()),
    Foo VARCHAR(256)
)
GO

INSERT INTO dbo.RowVerTest (Foo) VALUES ('Hello');
GO

--[LastChanged] and [CreationRowVersion] should be equal.
SELECT * FROM dbo.RowVerTest;
GO

UPDATE dbo.RowVerTest SET Foo = 'World' WHERE ID = 1;
GO

--[LastChanged] should be incremented, while [CreationRowVersion] 
--should retain its original value from the insert.
SELECT * FROM dbo.RowVerTest;
GO