我的表格中有一个名为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);
}
}
的数据类型。
由于
答案 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