2013-11-04 47 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'在每次調用中遞減以觸發,直到達到零,因此我們可以控制我們想要在真實表'文章'中執行多少次插入操作。 –