2017-01-09 2 views
0

ここに私のサンプルテーブルがあります。PostgreSQLの単一の属性を更新するためにトリガを変更する方法

CREATE TABLE employee_test(
idTst SERIAL PRIMARY KEY, 
monthDownload VARCHAR(6), 
changeDate DATE); 

私はmonthDownload属性が更新されたときに現在の日付とCHANGEDATE属性を更新してしまう機能やトリガーを作成しようとしています。 私はそれを持っている機能は1つの問題で動作します。更新されたレコードではなく、すべてのレコードが更新されます。

CREATE OR REPLACE FUNCTION downloadMonthChange() 
RETURNS TRIGGER AS 
$$ 
BEGIN 
IF NEW.monthDownload <> OLD.monthDownload THEN 
UPDATE employee_test 
SET changeDate = current_date 
where OLD.idTst = NEW.idTst; 
END IF; 
RETURN NEW; 
END; 
$$ 
Language plpgsql; 

トリガー

Create TRIGGER dataTest 
AFTER UPDATE 
ON employee_test 
FOR EACH ROW 
EXECUTE PROCEDURE downloadMonthChange(); 

私は次のUPDATE文を実行する場合:

UPDATE employee_test SET monthDownload = 'oct12' 
WHERE idTst = 1; 

をすべてCHANGEDATE行は、現在の日付で更新を取得します。 変更されたレコードを持つ行だけに現在の日付を更新させる方法がありますか?

enter image description here

答えて

2

あなたがbeforeトリガーを使用している場合は、afterトリガーを使用しなければならないときには、NEW

CREATE OR REPLACE FUNCTION downloadMonthChange() 
RETURNS TRIGGER AS 
$$ 
BEGIN 
IF NEW.monthDownload <> OLD.monthDownload THEN 
    NEW.changeDate = current_date; 
END IF; 
RETURN NEW; 
END; 
$$ 
Language plpgsql; 

に直接他のオプションを書くことができwhere句で主キーを含めることです。あなたがこれをやろうとしていたようですが、クエリにはOLDという偽りがあります。そのwhere節は、トリガー呼び出しの原因となるレコードのみを調べ、更新するレコードを限定しないことになっていました。

IF NEW.monthDownload <> OLD.monthDownload THEN 
UPDATE employee_test 
SET changeDate = current_date 
where idTst = NEW.idTst; 
関連する問題