2014-06-05 4 views
3

그래서 내 앱 서버의 데이터베이스에 마지막으로 업데이트 된 시간을 추가하려고합니다. 아이디어는 업데이트가 우리 여행 중 하나에 적용되는 시간을 기록한 다음 앱이 정확한 최신 정보를 모두 가지고 있는지 파악하라는 요청을 보낼 수 있다는 것입니다.다른 테이블의 열을 업데이트하는 트리거를 만들려면 어떻게해야합니까?

필자의 테이블에 열을 추가하고 서비스를 제공했으며, 결국 여행 테이블에 여행이 변경 될 때마다 열을 업데이트하는 트리거를 얻을 수있었습니다. 내 문제는 이제 여행과 관련된 정보가 여러 다른 테이블에도 저장된다는 사실에서 비롯된 것입니다 (예를 들어 여행을 구성하는 경로 테이블과 사용자가 볼 수있는 사진이 있습니다). 여행 등) ... 그리고 해당 데이터가 변경되면 여행의 업데이트 시간도 변경해야합니다. 나는 내 삶에 대해 방아쇠를 설정하는 방법을 알아낼 수 없기 때문에 일부 노선 정보를 변경하면 경로가 속한 여행 (들)의 마지막 업데이트 시간이 테이블에 업데이트됩니다.

이것은 내 방아쇠 코드입니다. 여행의 행이 업데이트되면 여행 테이블의 마지막 업데이트 된 열을 업데이트합니다.

CREATE OR REPLACE FUNCTION record_update_time() RETURNS TRIGGER AS 
    $$ 
     BEGIN 
      NEW.last_updated=now(); 
      RETURN NEW; 
     END; 
    $$ 
    LANGUAGE PLPGSQL; 

CREATE TRIGGER update_entry_on_entry_change 
    BEFORE UPDATE ON mydatabase.trip FOR EACH ROW 
    EXECUTE PROCEDURE record_update_time(); 

--I used the next two queries just to test that the trigger works. It 
--probably doesn't make a difference to you but I'll keep it here for reference 
UPDATE mydatabase.trip 
    SET title='Sample New Title' 
    WHERE id = 2; 
SELECT * 
    FROM mydatabase.trip 
    WHERE mydatabase.trip.id < 5; 

외래 키가있는 여행 행을 참조하는 행이 업데이트 될 때 업데이트해야합니다. SQL보다 경험이 많은 사람의 아이디어는 나보다 뛰어 납니까?

답변

0

mydatabase스키마의 매우 불행한 이름입니다.입니다.

트리거 기능은 다음과 같을 수 있습니다 :

CREATE OR REPLACE FUNCTION trg_upaft_upd_trip() 
    RETURNS TRIGGER AS 
$func$ 
BEGIN 

UPDATE mydatabase.trip t -- "mydatabase" = schema name (?!) 
SET last_updated = now() 
WHERE t.id = NEW.trip_id -- guessing column names  

RETURN NULL;    -- calling this AFTER UPDATE 

END 
$func$ LANGUAGE plpgsql; 

그리고는 (하지 trip 자체에) 모든 관련 테이블에 트리거에 사용되어야한다 :

CREATE TRIGGER upaft_upd_trip 
AFTER UPDATE ON mydatabase.trip_detail 
FOR EACH ROW EXECUTE PROCEDURE trg_upaft_upd_trip(); 

을 또한 포함 할 필요가 INSERTDELETE (가능하면 COPY) ...

이 접근 방법은 man 잠재적 고장 지점. 또는 sub-table에서 최신 last_updated을 동적으로 계산하는 조회 또는 뷰를 고려하십시오. 자주 업데이트하면이 방법이 더 나은 방법 일 수 있습니다.
드물게 UPDATESELECT 인 경우 첫 번째 방법으로 비용을 지불 할 수 있습니다.

+0

그래, 내 동료들과 이야기하면서 우리는이 문제를 해결할 더 좋은 방법을 찾았다. 적용 가능한 모든 테이블에 업데이트 된 열을 추가하고 쿼리를 수행하는 것이었다. 답변 해주셔서 감사합니다! (mydatabase는 내가 스키마 이름을 대체하기 위해 사용했던 것으로, 분명히 바보입니다. 사용중인 실제 스키마 이름이 아닙니다.) – cbhedd

관련 문제