Postgres 부울 필드가 True로 설정된 경우 날짜 필드를 업데이트합니다.
-
05-07-2019 - |
문제
예제를 위해 테이블을 고려하십시오
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
에게 fals
e, 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
.