문제

PostgreSQL 측에서 테이블에서 첫 번째 행이 삭제되는 것을 방지 할 수 있습니까?

카테고리 테이블이 있으며 응용 프로그램을 중단 할 수 있으므로 기본 범주의 삭제를 방지하고 싶습니다. 물론 응용 프로그램 코드로 쉽게 수행 할 수는 있지만 데이터베이스에서 수행하는 것이 훨씬 좋습니다.

나는 그것이 삭제 된 문의 규칙과 관련이 있다고 생각하지만, 문서화에서 내 문제에 근접한 것을 찾을 수 없었습니다.

도움이 되었습니까?

해결책

이것을 달성하는 가장 좋은 방법은이 테이블에서 삭제 트리거를 만드는 것입니다. 기본적 으로이 '기본값'카테고리가 항상 존재하는지 확인하기 위해 저장된 절차를 작성한 다음이 테이블의 삭제 이벤트에서 트리거를 사용하여 시행해야합니다. 이를 수행하는 좋은 방법은 이벤트 삭제에서 '기본'카테고리 행이 절대 삭제되지 않도록 보장 할 수있는 당 트리거를 작성하는 것입니다.

트리거 및 저장 절차에 대한 PostgreSQL의 문서를 확인하십시오.

http://www.postgresql.org/docs/8.3/interactive/trigger-definition.html

http://www.postgresql.org/docs/8.3/interactive/plpgsql.html

이 위키에는 귀중한 예가 있습니다.

http://wiki.postgresql.org/wiki/a_brief_real-world_trigger_example

다른 팁

당신은 규칙 시스템을 생각하는 것에 대해 옳았습니다. 여기 문제와 일치하는 예에 대한 링크입니다. 트리거보다 훨씬 간단합니다.

create rule protect_first_entry_update as
  on update to your_table
  where old.id = your_id
  do instead nothing;
create rule protect_first_entry_delete as
  on delete to your_table
  where old.id = your_id
  do instead nothing;

일부 답변은 한 점을 놓치고 있습니다. 또한 보호 행의 업데이트는 제한되어야합니다. 그렇지 않으면 먼저 금지 된 행을 업데이트하여 더 이상 금지 된 삭제 기준을 충족하지 못하도록하고 더 이상 보호되지 않으므로 업데이트 된 행을 삭제할 수 있습니다.

삭제하기 전에 A를 정의하려고합니다 방아쇠 책상 위에. 행을 삭제하려고 할 때 (PK와 일치하거나 별도의 "Protect"부울 열), 들어올리다 예외.

나는 PostgreSQL 구문에 익숙하지 않지만 보입니다 이것이 당신이하는 방법입니다.

CREATE FUNCTION check_del_cat() RETURNS trigger AS $check_del_cat$
    BEGIN            
        IF OLD.ID = 1 /*substitute primary key value for your row*/ THEN
            RAISE EXCEPTION 'cannot delete default category';
        END IF;

    END;
$check_del_cat$ LANGUAGE plpgsql;

CREATE TRIGGER check_del_cat BEFORE DELETE ON categories /*table name*/
    FOR EACH ROW EXECUTE PROCEDURE check_del_cat();

기본 범주를 참조하는 다른 테이블 (기본값이라고 함)에 행을 가질 수 있습니다. FK 제약 조건으로 인해 기본 범주의 삭제가 발생하지 않습니다.

트리거가 어떻게 작동하는지 명심하십시오. 삭제 명령문이 삭제되는 모든 행에 대해 발사됩니다. 그렇다고 트리거를 사용해서는 안된다는 의미는 아닙니다.이를 명심하고 가장 중요한 것은 사용 시나리오를 테스트하고 성능이 요구 사항을 충족하는지 확인해야한다는 의미는 아닙니다.

규칙이나 트리거를 사용해야합니까?

공식 문서에서 : "두 가지 모두에 의해 구현 될 수있는 것들에 대해서는 데이터베이스 사용에 따라 가장 적합합니다. 영향을받는 행에 대한 트리거가 한 번 발생합니다. 규칙은 쿼리를 조작하거나 추가 쿼리를 생성합니다. 한 명령문에 많은 행이 영향을받으며, 하나의 추가 명령을 발행하는 규칙은 모든 행에 요구되는 트리거보다 빠르며 여러 번 작업을 실행해야합니다. 그러나 트리거 접근법은 규칙 접근 방식보다 개념적으로 훨씬 간단합니다. , 초보자가 올바르게하기가 더 쉽습니다. "

자세한 내용은 문서를 참조하십시오.
http://www.postgresql.org/docs/8.3/interactive/rules-triggers.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top