【发布时间】:2018-02-09 05:24:51
【问题描述】:
我现在已经阅读了几个主题,并做了一些关于将更改记录到 mysql 表的研究。先说明一下我的情况:
我有一个带有 table: 'ticket'
的票务系统到目前为止,我已经创建了 triggers,它会在我的 table: 'ticket_history' 中输入一个重复的条目,其中有 "action" "user" 和 "timestamp" 作为附加列。经过几个星期的测试,我对这个构建有点不满意,因为每次更改都会在历史表中创建我的行的完整副本。我确实知道磁盘空间很便宜,我不应该担心它,但是为了检索某种日志或用户好看的历史记录是痛苦的,至少对我来说是这样。同样使用我编写的触发器,即使没有变化,我也会在历史记录中获得新的一行。但这只是我触发器的设计缺陷!
这是我的触发器:
BEFORE UPDATE ON ticket FOR EACH ROW
BEGIN
INSERT INTO ticket_history
SET
idticket = NEW.idticket,
time_arrival = NEW.time_arrival,
idticket_status = NEW.idticket_status,
tmp_user = NEW.tmp_user,
action = 'update',
timestamp = NOW();
END
我的新方法是为了避免触发
在这个话题上花了一些时间后,我想出了一个我想讨论和实施的方法。但首先我会对此有一些疑问:
我的想法是创建一个新表:
id sql_fwd sql_bwd keys values user timestamp
-------------------------------------------------------------------------
1 UPDATE... UPDATE... status 5 14 12345678
2 UPDATE... UPDATE... status 4 7 12345678
流程在我看来是这样的:
起初我会从数据库中选择一些或更多:
SELECT keys FROM ticket;
然后我在 2 个输入字段中显示数据:
<input name="key" value="value" />
<input type="hidden" name="key" value="value" />
点击提交并将其交给我的函数:
我会再次从 SELECT 开始:SELECT * FROM ticket;
并确保隐藏的输入字段 == 来自最新选择的值。如果是这样,我可以继续并知道同时没有其他用户更改了某些内容。如果隐藏字段不匹配,我将用户带回表单并显示一条消息。
接下来,我将为该操作构建 SQL 查询以及撤消这些更改的查询。
$sql_fwd = "UPDATE ticket
SET idticket_status = 1
WHERE idticket = '".$c_get['id']."';";
$sql_bwd = "UPDATE ticket
SET idticket_status = 0
WHERE idticket = '".$c_get['id']."';";
我在 ticket 上运行 UPDATE 并在我的新表中插入一个新条目以进行日志记录。
这样我可以尝试在两个用户同时编辑同一张票时捕获可能的覆盖,对于我的历史记录,我可以简单地查找键和值并生成某种列表。还有 SQL_BWD 我可以简单地撤消更改。
我的问题是:
- 每次我想更新某些内容时进行额外的选择会不会很明显?
- 我会失去一些使用触发器的好处吗?
- 有什么大的缺点吗
- 我的 mysql 服务器或 php 上是否有任何功能已经完成了类似的操作?
- 或者是否有更简单的方法来做类似的事情
- 我现在对触发器的微小改动是否已经足够了?
- 如果我理解这一点,MySQL 仅在值已更改但触发器仍然执行时才执行更新,对吗?
- 如果我能够更改触发器,我是否仍然可以在 2 个用户尝试在 mysql 服务器上同时编辑票证时以某种方式防止数据被覆盖,还是我会使用 PHP 来执行此操作?
谢谢你的帮助
【问题讨论】:
-
我认为允许两个用户同时编辑同一张票是一个坏主意。实施一些外部锁定机制(以及超时或强制接管)来阻止第二个用户。
-
我想过这一点,但不确定如何实施这种做法。例如,如果工作人员当前正在处理工单,假设正在添加与工单相关的新评论或消息,但同时客户致电并希望提高优先级。我试图对将要编辑和更新的数据进行分组,到目前为止,应该可以同时执行这两个操作。我的想法是存储一个时间戳并将票锁定 1 分钟左右,但如果我这样做并且某些票被锁定,因为电话开始响起并且噩梦开始
标签: php mysql database audit-trail