문제

예제를 위해 테이블을 고려하십시오

create table foo (
  contents text NOT NULL,
  is_active boolean NOT NULL DEFAULT false,
  dt_active date
)

레코드를 삽입합니다.

insert into foo (contents) values ('bar')

여태까지는 그런대로 잘됐다. 나중에, 나는 이제 레코드를 '활성화'하고 싶다 :

update foo set is_active = true

내가 언제하고 싶은지 is_active 변경되었습니다 false 에게 true, dt_active 설정되었습니다 now(). 보너스 포인트의 경우 좋을 것입니다 is_active 변경되었습니다 true 에게 false, dt_active는 null로 설정되었지만 나는 그것없이 살 수 있습니다.

이 하우스 키핑을 데이터베이스로 밀고 싶습니다. 클라이언트 코드를 훨씬 더 깨끗하게 만들었습니다 (많은 테이블 (및 테이블 내 열 튜플) 이이 기술의 혜택을받을 수 있기 때문에).

"지금"을 "지금"과 비교하기 위해 트리거 (PLPGSQL을 사용하고 있음)의 데이터베이스에서 현재 레코드를 꺼내는 방법에 대해 혼란스러워합니다. 코드 예제 또는 스 니펫에 대한 포인터는 크게 감사했습니다.

도움이 되었습니까?

해결책

CREATE OR REPLACE FUNCTION trg_update_foo() RETURNS TRIGGER AS
$BODY$
BEGIN
    IF OLD.is_active = false AND NEW.is_active = true THEN
        NEW.dt_active := now();
    ELSIF OLD.is_active = true AND NEW.is_active = false THEN
        NEW.dt_active := NULL;
    END IF;
    RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql';
CREATE TRIGGER trg_update_foo BEFORE UPDATE ON foo FOR EACH ROW EXECUTE PROCEDURE trg_update_foo();

작동해야합니다. 자세한 내용은 PL/PGSQL을 확인하십시오 매뉴얼을 트리거합니다, 및 추가 포인트 - 전체 PLPGSQL 문서.

다른 팁

PLPGSQL 트리거 프로 시저 내에서 호출되는 일부 특수 레코드 유형 변수에 액세스 할 수 있습니다. NEW 그리고 OLD 그것은 당신을 위해 만들어졌습니다.

에서 UPDATE 또는 INSERT 방아쇠 , NEW 새 데이터베이스 행의 레코드를 나타냅니다.

에서 UPDATE 또는 DELETE 방아쇠 , OLD 원래 데이터베이스 행의 값을 나타냅니다.

다른 진술 컨텍스트에서 이러한 레코드 변수는 다음과 같습니다. NULL.

따라서, 그것은 당신이 만들어야 할 것 같습니다. INSERT OR UPDATE 값을 보는 트리거 OLD.is_active 그리고 NEW.is_active.

다음은 문서 페이지입니다. http://www.postgresql.org/docs/8.1/interactive/plpgsql-trigger.html 이 페이지에는 사용하는 PLPGSQL 용 샘플 코드가 포함되어 있습니다 NEW 그리고 OLD

당신은 시도 했습니까? 수동?

모든 트리거 기능에는 몇 가지 자동 변수가 있습니다. 업데이트 트리거의 경우 기존 행 값에 액세스 할 수 있습니다. OLD 그리고 변화된 값을 통해 NEW

Old의 열 값을 간단히 확인할 수 있습니다. OLD.is_active. 다음과 같이 데이터베이스에 넣을 값을 변경할 수있는 것과 같은 방식으로 NEW.dt_active := now();

이 헬스를 바랍니다.

CREATE FUNCTION actrigger() RETURNS TRIGGER AS $$ BEGIN
    IF TG_OP='UPDATE' THEN
        IF NEW.is_active THEN
            IF NOT OLD.is_active THEN
                NEW.dt_active := current_date;
            END IF;
        ELSIF NEW.dt_active IS NOT NULL
            NEW.dt_active := NULL;
        END IF;
    END IF;
    RETURN NEW;
END; $$ LANGUAGE plpgsql;
CREATE TRIGGER foobefore BEFORE UPDATE ON foo FORR EACH ROW
    EXECUTE PROCEDURE actrigger();

그리고 당신은 돌볼 수 있습니다 INSERT 너무 유사 할 것입니다. OLD.

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