我成功实现了基于this answer的表的历史记录(用于审计),基本上建议创建两个表,其中一个包含当前版本,另一个包含具有真实数据的版本表:
CREATE TABLE dbo.Page(
ID int PRIMARY KEY,
Name nvarchar(200) NOT NULL,
CreatedByName nvarchar(100) NOT NULL,
CurrentRevision int NOT NULL,
CreatedDateTime datetime NOT NULL
CREATE TABLE dbo.PageContent(
PageID int NOT NULL,
Revision int NOT NULL,
Title nvarchar(200) NOT NULL,
User nvarchar(100) NOT NULL,
LastModified datetime NOT NULL,
Comment nvarchar(300) NULL,
Content nvarchar(max) NOT NULL,
Description nvarchar(200) NULL
我的UPDATE
到静态,非动态字段都可以正确识别版本控制(粗略的伪代码改编自dev't code):
$sql_pagecontent = array(
'PageID' => // logic to get PageID
'Title' => $data['Title']
'User' => $data['User'],
'LastModified' => $this->get_date(),
'Comment' => $data['Comment'],
'Content' => $data['Content'],
'Description' => $data['Description']
);
$this->db->insert('PageContent', $sql_pagecontent);
$id_version = $this->db->insert_id();
$sql_page = array(
'CurrentRevision' => $id_version
);
if($type_version === 'UPDATE')
{
$this->db->where('ID', $page_id_to_replace);
$this->db->update('Page', $sql_page);
}
else
{
$this->db->insert('Page', $sql_page);
}
问题是当我将此应用于带有UPDATE
的动态表时。
在UPDATE
期间,我希望实现以下功能,与非动态表(Page
和PageContent
的上下文)类似:
PageContent
新INSERT
行{新PageContent
),CurrentRevision
中添加了Page
的新行PageContent
新INSERT
行(现有PageContent
的更新),CurrentRevision
Page
中的UPDATE
行PageContent
已从Page
注意我希望这些动态表的每一行都保留在Page
和PageContent
中,如果用户想要检查更改,那么我就无法做{{1这只会淹没桌子。
我似乎无法使用当前实现正确过滤这些动态值。
请告知如何处理此用例。
解决方案
我不确定我目前对我所述要求的执行情况是否正确,可行或推荐,但是它确实起作用了:
INSERT
的ID PageContent
的ID Page
行Page
并将INSERT
应用为UPDATE
数字3是确保是否编辑/删除现有行或添加新行作为PageContent
中的当前版本的关键。数字4将其设置到位以确保每一行都被识别。