2012-06-25 2 views
0

두 개의 SQLite3 테이블 A와 B가 있습니다. A.X가 업데이트되면 B.Y를 수정하고 B.Y가 업데이트되면 A.X를 수정하려고합니다.sqlite3에서 트리거 깊이를 쉽게 감지하려면 어떻게해야합니까?

나는 두 개의 트리거를 사용할 수 있습니다

CREATE TRIGGER AtoB AFTER UPDATE OF X ON A BEGIN UPDATE B SET Y = ... 

CREATE TRIGGER BtoA AFTER UPDATE OF Y ON B BEGIN UPDATE A SET X = ... 

을하지만 모두 트리거 즉 하나는 항상 다른 호출에 상관없이 내가 수정하는 테이블, 한 번만 호출되지 않은 것으로 보인다.

업데이트는 A에서 B 방향으로 손실이 발생하기 때문에 하나만 실행하면됩니다. 반대 방향 B에서 A 로의 손실은 원하지 않지만 두 트리거가 모두 실행되면 그것은 양방향에서 손실이있다.

간단한 해결책은 "increment_trigger_depth", "decrement_trigger_depth"및 "get_trigger_depth"의 세 가지 UDF를 구현 한 다음 업데이트 문에서 "WHEN trigger_depth == 1"을 사용하는 것입니다. 그러나 SQLite3에서 트리거 깊이를 결정하는 더 쉬운 방법이 있습니까?

+0

이 같은 ... overcomplicated 트리거 설정 소리 트리거 작업을 가드 : - / –

답변

1

트리거 깊이를 유지하려면 새 테이블을 사용하십시오.

CREATE TABLE trigger_depth (depth); 
INSERT INTO trigger_depth VALUES (0); 

그런 increment_trigger_depth 사용

UPDATE trigger_depth SET depth = depth + 1; 

등에

사용

... WHEN (SELECT depth FROM trigger_depth) <= 0 BEGIN ... 

관련 문제