2017-11-01 4 views
-1

나는이 오류를 논리적으로 배치하는 것처럼 보이지 않는데, 대부분의 경우와는 달리 왜 정보를 거의 제공하지 않는지 (대개 매우 좋은 전처리 기가 아니면 논리를 파고들 수 있습니다. 또한 오류입니다. 내가 그 열쇠를 추가 잘 작동 다른 기능을 가지고, 그래서이 아니 그 .. 다음 트랜잭션이 실패 할 것 같다 다른과 내가PostgreSQL 트리거 함수 업데이트 오류

update guest_list set coatcheck = true where ticket_number = 3; 

"PL/pgSQL function coatcheck_gen() line 8 at SQL statement SQL statement "update guest_list set coatcheck_num = coat_num where ticket_number = old.ticket_number" PL/pgSQL function coatcheck_gen() line 8 at SQL statement SQL statement "update guest_list set coatcheck_num = coat_num where ticket_number = old.ticket_number"

이를 입력 할 때 터미널에 도착 페이지가 끝나면 끝납니다. 새로운 .old. 또는 숫자 만 사용하여 시도해 보았습니다. 아무것도. 같은 오류. 모든 테이블이 정상입니다. 모든 업데이트는 명령 완료시 작동합니다. 가 ... 다른 곳에서 알맞은 올바른 예에

나타나는 기능은 트리거

create trigger trg_coatchek_gen after update on guest_list for each row when (new.coatcheck = true) execute Procedure coatcheck_gen(); 
+0

나는 확실히 당신이 실현하려 시도하고있는 무슨 파악하지 않은을 sould. – Ingaz

+0

'각 행에 대해 업데이트 후 트리거'를 만들고 동일한 테이블을 업데이트하는 트리거를 생성했습니다. 진짜 의도입니까? 무엇이 잘못되었는지 생각해 본 적이 있다면? 거래에서 예외가 있습니까? 각 행에 예외가 있거나 예외가 없으며 잘못되었습니다. – Ingaz

+0

예. 따라서 코트 체크 체크가 true로 변경되면 코트 체크 번호가 생성됩니다. 그것을 테이블에 추가합니다. 이것은 사람이 참석 한 후에 만 ​​발생합니다. 그리고 손님 목록에. (티켓 행사를 작성하는 기능, 모든 유형의 이벤트 작업에 대한 기여도를 작성하는 기능. 코트 체크가 추가되기 전에 사람이 "참석"해야한다는 예외가 있습니다. 그래서 "코트 체크"가 실행될 때만 트리거가 발생합니다. 그 행에. 일단 발생하면 트리거가 함수로 가서 coatcheck_number를 만들어야합니다 .. – Zepalz

답변

0

당신은 트리거 내에서 테이블을 업데이트하여 무한 루프를 만들고있다

create or replace function coatcheck_gen() returns trigger as $gencoatcheck$ 
declare 
coat_num bigint; 
begin 
IF (TG_OP = 'UPDATE') then 
if (new.coatcheck = true) then 
coat_num := (old.frkey_id_event + old.frkey_id_guest); 
update guest_list set coatcheck_num = coat_num where ticket_number = old.ticket_number; 
return new; 
END IF; 
return new; 
end if; 
return new; 
end; 
$gencoatcheck$ LANGUAGE plpgsql; 

입니다. 먼저 이것을 호출하고 coatcheck = true을 설정하면 트리거가 테이블을 다시 업데이트하지만 coatcheck = true 이후 트리거가 다시 처리됩니다.이 루프는 끝나지 않습니다.

당신은

new.coatcheck_num = coat_num; 

하여 전체 라인

update guest_list set coatcheck_num = coat_num where ticket_number = old.ticket_number; 

를 교체하고 트리거 before update

+0

umm oh! 제안 된 변경 사항이 있지만 루프에 대해 무슨 뜻인지 알 수 있습니다. "오류 : 업데이트 될 튜플이 이미 있습니다. 현재 명령에 의해 트리거 된 작업으로 수정 됨 힌트 : BEFORE 트리거 대신 AFTER 트리거를 사용하여 다른 행에 변경 사항을 전파하는 것을 고려하십시오. " umm,"new.coatcheck_num = coat_num " 오류 : 관계 "guest_list"가 존재하지 않습니다. LINE 1 : u pdate guest_list set new.coatcheck_num = coat_num ti ... – Zepalz

+0

@Zepalz 아니요, 아니 전체 라인을 교체하십시오. 단지 그 부분이 아닌 – JGH

+0

오 오. 나는 그것을 얻는다. 그렇습니다. 모든 것이 더 느슨합니다. 네, 감사합니다. – Zepalz