bookmarks_polymorphic 재빌드 시 오류 발생

안녕하세요,

Rebuild 시 오류가 발생했습니다:

FAILED

Pups::ExecError: cd /var/www/discourse && su discourse -c ‘bundle exec rake db:migrate’ 실행 실패 (리턴 값: #<Process::Status: pid 1121 exit 1>)
실패 위치: /usr/local/lib/ruby/gems/3.1.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn’
파라미터 {“cd”=>“$home”, “hook”=>“db_migrate”, “cmd”=>[“su discourse -c ‘bundle exec rake db:migrate’”]}로 실행 실패
bootstrap이 종료 코드 1로 실패

위쪽으로 스크롤하면:

PG::DependentObjectsStillExist: ERROR: bookmarks 테이블의 post_id 컬럼은 다른 객체가 이 컬럼에 의존하고 있어 삭제할 수 없습니다.
DETAIL: bookmarks 테이블의 bookmarks_polymorphic_data_sync 트리거가 bookmarks 테이블의 post_id 컬럼에 의존합니다.
HINT: 의존하는 객체도 함께 삭제하려면 DROP … CASCADE를 사용하세요.

이 버그를 어떻게 해결할 수 있나요?

대상 브랜치를 stable인지 tests-passed인지 명시하는 것이 좋을 것 같습니다.

안녕하세요,

보통은 tests-passed 브랜치인데…
트리거를 수동으로 삭제해서 문제를 해결했습니다. 하지만 나중에 문제가 될지는 모르겠습니다.

좋아요. 문제가 생기면 언제든지 컨테이너에 들어가서 마이그레이션을 선택적으로 실행할 수 있습니다.

불행히도 3.0.0.beta16의 새 설치 환경에서는 삭제할 수 있는 해당 트리거가 psql에 없습니다.
하지만 2.9.0.beta12에서 만든 백업을 복원하면 동일한 오류가 발생합니다.

ERROR: 다른 객체가 이 열에 의존하고 있으므로 bookmarks 테이블의 post_id 열을 삭제할 수 없습니다
DETAIL: bookmarks 테이블의 bookmarks_polymorphic_data_sync 트리거가 bookmarks 테이블의 post_id 열에 의존합니다

수정:
이제 이해했습니다 - 원본에서 트리거를 삭제했고, 업데이트와 백업 복원이 다시 작동하기 시작했습니다 - 힌트 감사합니다

@DeviceNull

트리거를 어떻게 삭제하셨나요?

디스코urses 업그레이드 중 비슷한 문제가 발생하고 있습니다.

Caused by:
PG::DependentObjectsStillExist: ERROR:  cannot drop column post_id of table bookmarks because other objects depend on it
DETAIL:  trigger bookmarks_polymorphic_data_sync on table bookmarks depends on column post_id of table bookmarks
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

DB 마이그레이션 단계에서 업그레이드가 실패하는 비슷한 문제를 겪고 계신 분이 있으신가요?

아래 단계를 수행한 결과 업그레이드가 성공적으로 완료되었습니다!

업그레이드 중 컨테이너가 중지되었으므로 컨테이너를 시작합니다.

./launcher start app
./launcher enter app

psql 명령 프롬프트에 진입합니다.

sudo -u postgres psql discourse

트리거를 확인합니다.

SELECT tgname FROM pg_trigger;

트리거를 삭제합니다.

DROP TRIGGER IF EXISTS bookmarks_polymorphic_data_sync ON bookmarks CASCADE;

이제 다시 빌드합니다.

./launcher rebuild app

  1. 터미널( bash로 가정)에서 컨테이너 내부의 mysql 콘솔을 시작합니다:
    docker exec -i name_of_your_container mysql

mysql 콘솔에서:
use discourse;
DROP TRIGGER bookmarks.bookmarks_polymorphic_data;

콘솔을 종료하려면
exit
을 입력하세요.

그 후 업데이트 스크립트가 컬럼을 삭제할 수 있어야 하며, 모든 것이 원활하게 진행되기를 바랍니다 - 좋은 결과 있기를 기원합니다.