使用历史记录表更新动态SQL表

时间:2016-09-21 16:07:43

标签: php mysql sql database codeigniter

我成功实现了基于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期间,我希望实现以下功能,与非动态表(PagePageContent的上下文)类似:

  • PageContentINSERT行{新PageContent),CurrentRevision中添加了Page的新行
  • PageContentINSERT行(现有PageContent的更新),CurrentRevision Page中的UPDATE
  • 已删除的PageContent已从Page
  • 中删除

注意我希望这些动态表的每一行都保留在PagePageContent中,如果用户想要检查更改,那么我就无法做{{1这只会淹没桌子。

我似乎无法使用当前实现正确过滤这些动态值。

请告知如何处理此用例。

解决方案

我不确定我目前对我所述要求的执行情况是否正确,可行或推荐,但是它确实起作用了:

  1. 获取当前正在修改的INSERT的ID
  2. 获取当前正在修改的PageContent的ID
  3. 删除ID为#1 的所有Page
  4. 执行Page并将INSERT应用为UPDATE
  5. 的操作类型

    数字3是确保是否编辑/删除现有行或添加新行作为PageContent中的当前版本的关键。数字4将其设置到位以确保每一行都被识别。

0 个答案:

没有答案