4

PostgreSQLでビューのトリガーを作成したいと思います。考え方は、すべての新しいデータが挿入される条件を満たす必要があるということです。しかし、ここで何かがおかしいので、マニュアルで答えを見つけることができません。

CREATE OR REPLACE VIEW My_View AS 
SELECT name, adress, count FROM club, band, country;

CREATE OR REPLACE FUNCTION insert() RETURNS TRIGGER AS $$
BEGIN
    IF(NEW.count > 10) THEN
    INSERT INTO My_View VALUES (NEW.name, NEW.adress, NEW.count);
    END IF;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER insert INSTEAD OF INSERT ON My_View
FOR EACH ROW EXECUTE PROCEDURE insert();
4

1 に答える 1

4
  • 関数のステートメントの最後にセミコロン(; )がありません。INSERT

  • insertはSQL標準で予約語であり、トリガー名または関数名として使用しないでください。PostgreSQLで許可されているとしても、それは非常に悪い考えです。

  • club, band, countryビュー定義には、3つのテーブルの結合条件はありません。これは、につながりますが、これは非常に高額CROSS JOINになる可能性があります。各テーブルに1000行ある場合、 1,000,000,000の組み合わせが得られます。あなたは間違いなくそれを望んでいません。

  • また、あいまいさを避けるために、ビュー定義の列をテーブル修飾する必要があります。

CREATE OR REPLACE VIEW my_view AS 
SELECT ??.name, ??.address, ??.mycount
FROM club    cl
JOIN band    ba ON ?? = ??
JOIN country co ON ?? = ??;

疑問符を残した場所に記入する必要があります。

  • INSERTまた、ステートメントには常に列定義リストを追加してください。

  • そして最後に、同じビューに再び入りたくないINSERT場合は、無限ループが発生し、エラーの主な原因となる可能性があります。

CREATE OR REPLACE FUNCTION f_insert()
  RETURNS TRIGGER AS
$func$
BEGIN
   IF NEW.mycount > 10 THEN
      INSERT INTO my_view ???? (col1?, col2?, col3?)
      VALUES (NEW.name, NEW.address, NEW.mycount);
   END IF;
END
$func$ LANGUAGE plpgsql;

ところで、count識別子としても使用しないでください。代わりに使用mycountします。

于 2013-01-06T20:26:27.233 に答える