SQLite中如何用触发器执行取消和重做逻辑--转

本文介绍如何在SQLite中利用触发器执行撤销和重做逻辑。通过创建一个撤销记录表,每当有DELETE、INSERT、UPDATE操作时,触发器会生成相应的撤销操作SQL,存储在撤销记录表中。使用TCL语言示例展示触发器的生成,并讨论如何通过undo::activate等指令控制撤销/重做机制的状态。
摘要由CSDN通过智能技术生成

 

SQLite中如何用触发器执行取消和重做逻辑

<script></script>标签:

知识/探索

<!-- 正文开始 -->

这页主要描述一个使用SQLite作为主要数据结构的应用程序如何使用触发器去执行取消和重做逻辑。

我的想法是创建一个特殊的表格(例如名为撤销记录),表格保存数据库撤销和重做变化所需的信息。因为数据库中的每个表格都需要参与撤销和重做,每个DELETE,INSERT,和UPDATE都生成了触发器,DELETE,INSERT,和UPDATE可以在撤销日志表格中生成登记项,这个登记项将撤销操作。撤销表格中的登记项由一般的SQL语句组成,为了完成撤销,SQL语句可以被重新运行。

例如,如果你想在类似下面表格中执行撤销或重:

 CREATE TABLE ex1(a,b,c);
 

Then triggers would be created as follows:

 CREATE TEMP TRIGGER _ex1_it AFTER INSERT ON ex1 BEGIN
INSERT INTO undolog VALUES(NULL,'DELETE FROM ex1 WHERE rowid='||new.rowid);
END;
CREATE TEMP TRIGGER _ex1_ut AFTER UPDATE ON ex1 BEGIN
INSERT INTO undolog VALUES(NULL,'UPDATE ex1
SET a='||quote(old.a)||',b='||quote(old.b)||',c='||quote(old.c)||'
WHERE rowid='||old.rowid);
END;
CREATE TEMP TRIGGER _ex1_dt BEFORE DELETE ON ex1 BEGIN
INSERT INTO undolog VALUES(NULL,'INSERT INTO ex1(rowid,a,b,c)
VALUES('||old.rowid||','||quote(old.a)||','||quote(old.b)||
','||quote(old.c)||')');
END;
 

在ex1表格中执行每个INSERT后, the _ex1_it 触发器生成DELETE语句的文本,它将撤销INSERT操作。 The _ex1_ut触发器生成UPDATE语句,这语句将取消一个UPDATE所产生的作用。_ex1_dt触发器生成一个语句,这语句将取消一个 DELETE所具有的作用。

要注意quote()函数在这些触发器中的使用。quote()函数在SQLite中是标准的。它把它的参数转换成一种适合被包含在 SQL语句中的形式。数字值不改变。单个的quotes被加在字符串之前或之后,任何内在的单个quotes都被逃逸。quote()函数被加入 SQLite是为了执行撤销和重做操作。

当然,你也可以像上面一样用手生成触发器。但这个技术最突出的特点就是这些触发器可以自动生成。

例子中编码的语言是TCL。使用其它语言也是可以的,但是有可能要做更多工作。记住,这里的编码是demonstration技术,不是一个方便的模式,不能自动的为你做每件事。下面所示的demonstration编码是源于程序执行过程中所使用的真实的代码。但你在使用它的时候,为了满足你的需要,你需要做些改变。</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值