2013-11-04 21 views
0

首先我直接在SQLite数据库管理软件中查询。因此,对我而言,编程语言的任何使用都是不可能的,我唯一的选择就是使用触发器。如何在使用SQLite的递归触发器中限制行插入?

我的数据库中有一个名为表文章,我想用ñ测试purpposes虚拟对象来填充没有达到触发的递归限制(限,我无法改变,因为我将不得不重新编译数据库)。我想,通过阅读官方文件,默认这个限制被固定为500。

到目前为止,我已经创建了一个functionnal触发,但我无法后ň插入停止其递归:

CREATE TRIGGER 'myTrigger' 
AFTER INSERT ON 'Article' 
WHEN (insertedRowNumber < 500) 
BEGIN 
    INSERT INTO Article(...) VALUES(...); 
END; 

表结构不包含任何形式的时间戳以及它不能被更改,因为数据库已被部署用于生产。

如何限制用提供的触发器模式插入的行数?

谢谢你的帮助!

回答

0

如果你能在Article,而不是插入的数量限制的条目,只是:当你做

CREATE VIEW hlpArticle(a, ..., z, hlpCnt) AS SELECT a, ..., z, 1 AS hlpCnt FROM Article; 
CREATE TRIGGER hlpTrigger INSTEAD OF INSERT ON hlpArticle WHEN (NEW.hlpCnt>0) BEGIN 
    INSERT INTO Article(a, ..., z) VALUES(NEW.a, ..., NEW.z); 
    INSERT INTO hlpArticle(a, ..., z) VALUES(NEW.a, ..., NEW.z, NEW.hlpCnt-1); 
END; 

所以:

CREATE TRIGGER myTrigger AFTER INSERT ON Article WHEN ((SELECT COUNT() FROM Article)<500) BEGIN INSERT INTO Article(...) VALUES(...); END; 

另一种选择是使用辅助视图

INSERT INTO hlpArticle(a, ..., z, hlpCnt) VALUES('val_a', ..., 'val_z', 500); 

它会在Article上插入500条记录。

+0

嘿谢谢你的快速回答,但我有一个问题:是不是创建的视图肯定?或者每次我的触发器被调用时它会被更新?我问这是因为我想在Article表中插入100000个虚拟行,我唯一的解决方案是执行(100000/500)次我的触发器来填充此数据库。 – Aymeric

+0

查看有任何数据。在这种情况下,只是对“Article”的查询 - 但这只是一种解决方法,可以使用“INSTEAD OF”触发器。额外的列'hlpCnt'在每次调用中递减以触发,直到达到零,因此我们可以控制我们想要在真实表'文章'中执行多少次插入操作。 –