0

klienta_nrタスクは、テーブルにある列の特定の行を更新することklientu_ieteikumiです。klientiテーブルで特定の行が削除された場合。このコードは、特定の行ではなく列全体を更新します。何が問題ですか?

CREATE FUNCTION "funkc"() RETURNS "opaque" AS '
DECLARE
BEGIN

IF (TG_OP = ''DELETE'') THEN
UPDATE klientu_ieteikumi SET klienta_nr = NULL ; 
END IF;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';

CREATE TRIGGER "triger"
AFTER DELETE ON "klienti"
FOR EACH ROW EXECUTE PROCEDURE funkc();

これは私が望んでいたことをしました、とにかくみんなありがとう:)

CREATE FUNCTION "funkcija1"() RETURNS TRIGGER AS $$

BEGIN

UPDATE klientu_ieteikumi SET klienta_nr = NULL 
FROM klienti WHERE old.klienta_nr = klientu_ieteikumi.klienta_nr;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER "trigeris"
AFTER DELETE ON "klienti"
FOR EACH ROW EXECUTE PROCEDURE funkcija1();
4

2 に答える 2

2

WHEREステートメントの影響を受ける行数を制限する句が必要です。

編集:

UPDATE klientu_ieteikumi 
SET klienta_nr = NULL 
WHERE klienta_ieteikumi.klienta_nr = klienti.klienta_nr
于 2012-12-06T20:21:07.153 に答える
0

あなたが提示した「解決策」は機能せず、卑劣な方法で間違っています。

CREATE FUNCTION funkcija1()
  RETURNS TRIGGER AS
$func$
BEGIN

CREATE FUNCTION funkcija1()
  RETURNS TRIGGER AS
$func$
BEGIN

UPDATE klientu_ieteikumi
SET    klienta_nr = NULL 
FROM   klienti  -- !!
WHERE  klientu_ieteikumi.klienta_nr = OLD.klienta_nr;

RETURN NEW;
RETURN NULL;

END
$func$ LANGUAGE plpgsql;


CREATE TRIGGER trigeris
AFTER DELETE ON klienti
FOR EACH ROW EXECUTE PROCEDURE funkcija1();
  • トリガーNEWにはありません。AFTERこれはまったく機能せず、すぐに例外が発生します。

  • 句内のバインドされていない (そしてまったく無意味な) テーブルklientiは、 . つまり、 は 1 回だけではなく、 にある行の数だけ実行されます。これはパフォーマンスの大きな障害となり、エラー メッセージが表示されないため、 が見つからない可能性があります。サーバー上の多くの無駄なサイクルとテーブルの肥大化だけです。FROMCROSS JOINUPDATEklienti

于 2013-03-30T09:59:59.207 に答える