2010-05-17 2 views
2

변경 될 수 있습니다. 나의 첫 번째 생각은 spaces 테이블의 이름을 allspaces으로 바꾸고, 새로운 컬럼 deleted을 추가하고, 이전 테이블 대신에 spaces 뷰를 생성하는 것이었다. 뷰는 삭제되지 않은 공간 만 반환합니다. spaces보기에서 INSERT, UPDATE 및 DELETE를 허용하는 세 가지 규칙을 만들었습니다. DELETE 규칙은 deleted 필드를 변경하기 만하므로 뷰에서 데이터를 제거하지만 모든 데이터는 데이터베이스에 남아 있습니다.는 DELETE의 반환 값은 내가 결정적으로 Confluence의 위키에 공백을 제거 할 수있는 못하도록하려고 PostgreSQL을

문제는 이제 PostgreSQL의에서 spaces 반환 DELETE 0에 문을 삭제합니다. 이로 인해 Hibernate가 플립 아웃되고 예외가 발생하고 Confluence가 폭발합니다.

대신 지배 온 삭제 된 행 대신 수정 PostgreSQL의 반환 행이 어쨌든있다.

+0

사용자가 Confluence 테이블에 직접 액세스 할 수있는 이유는 무엇입니까? –

+0

Confluence에는 공간을 데이터베이스에서 삭제하는 "Remove Space"안에 버튼이 있습니다. 현재이 IMHO가 대단히 위키 인 영구적입니다. 데이터베이스 수준에서이 문제를 해결하려고합니다. –

답변

0

난 정말 당신이 무엇을 달성하고자 다음 아니지만, 아마 당신은 VOID 반환하는 함수에서 삭제 문을 넣을 수있는 다음 그것을 호출.

CREATE OR REPLACE FUNCTION delete_space(pid integer) 
    RETURNS void AS 
$BODY$ 
DECLARE aid INTEGER; 
BEGIN 
    delete from spaces where id=pid; 
    return; 
END; 
$BODY$ 
    LANGUAGE 'plpgsql'; 

사용하려면

select * from delete_space(3); 
1

이 (당신이 관리 할 수있는 공간의 수에 따라) 규모 것입니다,하지만 난 XML에 주기적으로 백업 공간을 얼마나 잘 확실하지. 이것은 Confluence CLI를 사용하여 API를 통해 쉽게 수행 할 수 있습니다

confluence --action exportSpace --space "spaceName" --file "target/output/confluencecli/spaceName.xml"

당신은 연령에 따라 이러한 백업을 회전하고, 사용자에 의한 공간 삭제의 경우에 가장 최근의 것들을 지킬 수있다.

이 단계를 더 진행하려면 실제로 공간을 삭제하는 작업 (confluence/spaces/removespace.vm)을 수정하고 제거가 확인되기 전에 XML에 공간을 백업하는 논리를 삽입 할 수 있습니다. 이것은 훨씬 더 좋은 스케일 것입니다!

+0

불행히도 우리는 수천 개의 공간을 가지고있어 예정된 수출이 가능하지는 않지만 나는 공간 제거 행동을 납치한다는 생각을 좋아합니다. –

1

당신은 온 아카이브 테이블에 삭제 된 행을 저장 트리거를 삭제 추가 할 수 있습니다. 응급 복구 기능을 응용 프로그램에 추가하여 삭제 된 행을 복구 할 수 있습니다.

+0

그래, 그게 내 처음 시도 였어. 내 규칙이 반대 방향을 제외하고는 똑같은 효과가 있었지만, 단일 행 삭제는 두 행을 수정하고 Hibernate는 예외를 던졌다. –

+0

나는 Hibernate가 데이터베이스에서 트리거를 사용하는 것을 허용하지 않는다고 믿을 수 없다. 어딘가에 옵션이 있어야한다! – peufeu

+0

예, Hibernate는 그것을 허용하지만, 코드 변경입니다. 그리고 모든 문제는 이것이 폐쇄 된 소스 제품이라는 것입니다. –

관련 문제