2011-12-04 6 views
2

私は、成績が更新された学生のすべての友人の成績を更新するトリガーを作成しようとしています。SQLiteでトリガー再帰を防止するにはどうすればよいですか?

create trigger upgrade 
after update on Highschooler 
when new.grade=old.grade+1 and trigger_nestlevel() < 2 
begin 
    update Highschooler 
    set grade=new.grade 
    where ID in (
     select ID2 
     from Friend 
     where ID1=old.ID 
    ) 
; 
end 

グレードが上がった人の友人(友人の...)も「アップグレードされました」これをどのように停止できますか?

答えて

3

Limits In SQLiteで読むことができるので、PRAGMA recursive_triggersステートメントを使用して再帰トリガ機能をクリアすることができます。トリガー再帰の

10の最大深さ

SQLiteはメモリの無制限量 を使用することから再帰トリガを含む ステートメントを防止するために、トリガーの再帰の深さを制限します。

SQLiteバージョン3.6.18より前のトリガーは再帰的ではなかったので、 この制限は意味がありませんでした。バージョン3.6.18から、再帰的な トリガーがサポートされましたが、 PRAGMA recursive_triggersステートメントを使用して明示的に有効にする必要がありました。バージョン3.7.0以降、デフォルトで 再帰トリガーが有効になっていますが、手動で を無効にしてPRAGMA recursive_triggersを使用することができます。 SQLITE_MAX_TRIGGER_DEPTHは、再帰トリガーが有効な場合にのみ意味があり、 です。

デフォルトの最大トリガー再帰深度は1000です。

関連する問題