2011-08-11 5 views
1

IDPARENT_ID 테이블이 있습니다.오라클 : 트리 트리 업데이트

"업데이트 중"트리거를 만들려고하므로 ID이 업데이트 될 때마다 ID을 가리키는 PARENT_ID도 업데이트됩니다.

그러나 내가 볼 수있는 주요 문제는 오라클이 트리거가 현재 실행중인 테이블에서 선택할 수 있다고 생각하지 않는다는 것입니다.

필자는 PL/SQL 함수에서 "업데이트"코드를 래핑 할 수 있다는 것을 알고 있지만 SQL을 사용하여이 데이터를보다 쉽게 ​​조작 할 수있는 사용자를 보유하고 있습니다.

사용자가 많은 PL/SQL을 호출하지 않고도 달성 할 수있는 가장 좋은 방법은 무엇입니까 (PL/SQL을 사용하면 분명히 구현할 수 있습니다. 분명히 사용자에게는 투명합니다) .

답변

1

테이블에서 뷰를 기반으로 한 다음 instead of 트리거를 사용하여 뷰를 업데이트 할 수있게되었습니다. 트리거 대신 기본 테이블의 idparent_id에 대한 적절한 업데이트가 수행되었습니다.

1

트리거에 중첩 된 PL/SQL조차도 여기에 돌연변이가 발생합니다.

정규화 문제와 비슷합니다. 왜 다른 행을 업데이트해야합니까? 나는 당신이 유지하고있는 그 가치를 보면서 다른 테이블로 옮길 것을 제안 할 것입니다 ...

때로는 합법적 인 돌연변이를 때로는 얻을 수있는 권장 방법이 아닙니다 ... PRAGMA AUTONOMOUS_TRANSACTION - 저는 그것에 맡길 것입니다. 당신이 그것을 보러 :)

+0

+1은 기술적으로 정규화 문제가 아니라 대리모 대신 자연 키를 선택하는 문제를 제외하고는 동의했습니다. –

1

당신은 패키지와 두 개의 트리거가 필요합니다.

첫 번째 트리거는 after update for each row입니다. 패키지 전역 변수에서 업데이트 된 ID를 저장합니다.

두 번째 트리거는 after update trigger (without for each row)입니다. 이 트리거는 패키지 전역 변수에서 ID의 parent_id를 업데이트 할 수 있습니다.

+0

동의합니다. 두 개의 서로 다른 세션이 동일한 부모의 두 개의 서로 다른 하위 레코드를 동시에 업데이트하는 경우 동시성 문제에 대해 생각해보십시오. –