我很想在视图中即时计算它。使用您可以使用的日期/ID 自动识别版本信息。
省略VersionNumber
专栏来自InvoiceVersion
,然后输入带有默认值的日期时间,并使用窗口函数为您计算版本(一旦舒服,就将其设为视图)。
分区由InvoiceID
,并按以下顺序排列DateAdded
to the InvoiceVersion
表,以及InvoiceVersionID
如果同时添加两个。
对删除内容的控制实际上应该在前端强制执行,但可以通过删除后触发的触发器来完成,并在未删除全部数据时恢复数据。你可以抓住InvoiceID
(s) 从触发器中删除的表中,并且如果InvoiceID
(s) 仍然存在于InvoiceVersion
表,回滚并引发错误。
另一种选择不是实际删除,而是只是将“已删除”位列添加到Invoice
桌子。将发票标记为“已删除”,但切勿将其从表中删除。那么在你看来,加入Invoice
表,并添加where deleted=0
.
希望这可以帮助。
查看示例:
IF OBJECT_ID('TEMPDB..#Invoice') IS NOT NULL DROP TABLE #Invoice
IF OBJECT_ID('TEMPDB..#InvoiceVersion') IS NOT NULL DROP TABLE #InvoiceVersion
CREATE TABLE #Invoice (
InvoiceID bigint identity(1,1) not null primary key,
CreateDate datetime not null
);
CREATE TABLE #InvoiceVersion (
InvoiceVersionID bigint identity(1,1) not null primary key,
InvoiceID bigint not null,
Col1 varchar(100),
Col2 int,
DateAdded datetime default CURRENT_TIMESTAMP
);
-- CREATE Invoice#1 & Invoice#2
INSERT INTO #Invoice (CreateDate) SELECT CURRENT_TIMESTAMP;
INSERT INTO #Invoice (CreateDate) SELECT CURRENT_TIMESTAMP;
-- CREATE 1 "version" for Invoice#1 & 4 for Invoice#2 & then 1 more for Invoice#1
INSERT INTO #InvoiceVersion (InvoiceID, Col1, Col2) SELECT 1, 'TEST 1', 543
INSERT INTO #InvoiceVersion (InvoiceID, Col1, Col2) SELECT 2, 'TEST 2', 34
INSERT INTO #InvoiceVersion (InvoiceID, Col1, Col2) SELECT 2, 'TEST 2', 242
INSERT INTO #InvoiceVersion (InvoiceID, Col1, Col2) SELECT 2, 'TEST 2', 965
INSERT INTO #InvoiceVersion (InvoiceID, Col1, Col2) SELECT 2, 'TEST 2', 184
INSERT INTO #InvoiceVersion (InvoiceID, Col1, Col2) SELECT 1, 'TEST 1', 684
--SELECT * FROM #Invoice
--SELECT * FROM #InvoiceVersion
--CREATE VIEW VersionedInvoice
--AS
SELECT *, ROW_NUMBER() OVER(PARTITION BY InvoiceID ORDER BY InvoiceID, DateAdded, InvoiceVersionID) as VersionNumber
FROM #InvoiceVersion