2017-12-11 21 views
0

私はニュース用の小さなテーブルを持っています。私は(唯一の更新された行に対する)行の更新日時と更新時間を設定し、トリガー更新後の更新後のPostgreSQLトリガー

私は以下の作ってみましたようにしたい:

CREATE FUNCTION add_update_dates() 
RETURNS TRIGGER 
LANGUAGE plpgsql 
AS $$ 
BEGIN 
    IF (OLD.news_name IS DISTINCT FROM NEW.news_name OR 
    OLD.news_description IS DISTINCT FROM NEW.news_description OR 
    OLD.news_text IS DISTINCT FROM NEW.news_text) THEN 
    UPDATE news SET news_update_date = current_date, news_update_time = current_time; 
END IF; 
RETURN new; 
END 
$$; 

CREATE TRIGGER update_news_dates 
AFTER UPDATE ON news 
FOR EACH ROW 
EXECUTE PROCEDURE add_update_dates(); 

をしかし、トリガは、各列を更新します私のテーブル(更新されていないテーブルさえも)は、更新されたテーブルのみを必要とするときです。私は間違って何をしていますか?

+0

update table文は、PostgreSQLで許可されているトリガ内の同じテーブルにありますか?私は、オラクルでは、テーブルの変更でエラーが発生しているはずです。 –

+0

@KaushikNayak: 'AFTER UPDATE'トリガーでは許可されているが、' BEFORE UPDATE'トリガーでは許可されていないと思う。 –

答えて

1

updateステートメントは、テーブル内のすべての行を更新しています。 where句はありません。さておき、別々の列に日付/時間を記憶することは私には意味がないので

CREATE FUNCTION add_update_dates() 
RETURNS TRIGGER 
LANGUAGE plpgsql 
AS $$ 
BEGIN 
    IF (OLD.news_name IS DISTINCT FROM NEW.news_name OR 
     OLD.news_description IS DISTINCT FROM NEW.news_description OR 
     OLD.news_text IS DISTINCT FROM NEW.news_text 
    ) THEN 
    NEW.news_update_date := current_date; 
    NEW.news_update_time := current_time; 
    END IF; 
    RETURN new; 
END; 
$$; 

ちょうど割り当てを使用します。

+1

トリガー定義を 'BEFORE UPDATE'に変更する必要もある –

関連する問題