2009-07-29 6 views
1

いけない前にスイッチ:Postgresqlのトリガ:後からトリガが、私はこの単純なplpgsqlが機能してい火災

CREATE FUNCTION "update_times"() RETURNS trigger AS ' 
    BEGIN 
     NEW.update_time = NOW(); 
     RETURN NEW; 
    END;' 
LANGUAGE "plpgsql"; 

--The trigger: 
CREATE TRIGGER test_update_time BEFORE UPDATE ON contact FOR EACH ROW EXECUTE PROCEDURE update_times(); 

をして、これはうまく動作しますが、だけで、BEFOREトリガー...

私は火にprefern (いけない仕事

CREATE FUNCTION "update_times_after"() RETURNS trigger AS ' 
    BEGIN 
     OLD.update_time = NOW(); 
     RETURN OLD; 
    END;' 
LANGUAGE "plpgsql"; 

--The trigger: 
CREATE TRIGGER test_update_time_after AFTER UPDATE ON contact FOR EACH ROW EXECUTE PROCEDURE update_times_after(); 

しかし AFTERトリガー:トリガーは、更新後、私は機能ととして、トリガ自体を変更しましたトリガーは機能しません)。

私は間違っていますか?

答えて

1

データが既にテーブルに保存されているときにトリガーが実行された後。ですから、特にOLDの変更は意味をなさないでしょう。

ディスクに保存するデータを変更する場合は、保存する前に行う必要があります。

+0

はい、しかし、更新SQLが実行され、データが保存されているときに、 'update_time'フィールドを更新したいと思います... – Strae

+0

わかっているかわかりません。この場合、前と後の違いは何ですか? とにかく - テーブルに保存されている行を変更する場合は、BEFOREトリガーで実行する必要があります。 –

+0

Ops ..私の悪い、私はドキュメントを誤解している..私は、行を更新する前に、BEFOREトリガが発生したと思ったので、クエリが失敗した場合、トリガーはとにかく発生します。私の悪い。 – Strae

関連する問題