10

データベースのトリガーやビューにあまり詳しくありません。現在、PostgreSQL と HSQL を使用しています。データベースはそれほど重要ではありませんが。次のようなものを提供するデータベースがあるかどうか疑問に思っています。

次のような(例の)テーブルがあります。

CREATE TABLE DUMMY_TABLE (ID INTEGER, NUMBER INTEGER);

次のようなビューを作成しました。

CREATE VIEW DUMMY_VIEW AS SELECT * FROM DUMMY_TABLE WHERE NUMBER > 5;

いくつかのエンティティを挿入します。

INSERT INTO DUMMY_TABLE VALUES(1,2);
INSERT INTO DUMMY_TABLE VALUES(1,10);

もちろん、呼び出したときに DUMMY_VIEW には VALUES(1,10) のみが含まれます

SELECT * FROM DUMMY_VIEW

だから今私がやりたいことは、NUMBER > 5 を持つエンティティが挿入されるたびに呼び出される DUMMY_VIEW にトリガーを追加することです。

HSQL と PostgreSQL の両方で DUMMY_VIEW にトリガーを直接追加しようとしました。しかし、ビューにトリガーを追加することはできないと言われています。

これ(または機能的に同様のソリューション)は可能ですか?

4

7 に答える 7

18

PostgreSQL 9.1+ はビューのトリガーをサポートしていることに注意してください。これについての簡単な説明は、 WAITING FOR 9.1 – TRIGGERS ON VIEWSを参照してください。

于 2011-07-17T22:17:43.550 に答える
7

はい、トリガーをビューに直接配置することはできません。実行すべきことは、ベース テーブルにトリガーを配置し、新しい NUMBER 行の値が 5 より大きいかどうかを確認することです。

注: ビューは保存された select ステートメントにすぎないため、実際にはデータを保持しません。そのため、ビュー構造でデータが挿入、削除、または更新されているかどうかを確認することはできません。

于 2009-01-16T16:59:18.650 に答える
2

ビューではなく、テーブルにトリガーを置く必要があると思います。

トリガーはビューでクエリを使用できるため、DRYになります。

トリガーをテーブルではなくビューに配置する必要がある他の理由はありますか?

コメントへの回答の例

-- Create function
CREATE FUNCTION doWhatIwant() RETURNS trigger AS '
BEGIN
IF NEW.number > 5 THEN
  do_stuff
END IF;
RETURN NEW;
END;
' LANGUAGE plpgsql;

-- Create trigger
CREATE TRIGGER yourTrigger AFTER INSERT ON dummy_table
  FOR EACH ROW EXECUTE PROCEDURE doWhatIwant();
于 2009-01-16T16:53:24.637 に答える
2

トリガーの代わりにルールを使用することもできますが ()、ルールは PostgreSQL 固有の機能であることを覚えておいてください。

于 2009-01-16T22:04:41.433 に答える
1

何を達成したいのかわかりません。

トリガーは、データ変更時にコードを実行します。ビューは(たとえば)「呼び出し可能なデータのサブセット」です。あなたがそれから選択しない限り、それは事実上存在しません。何も含まれていないため、トリガーを含めることはできません。

したがって、基本的にはベーステーブルにトリガーが必要です。

于 2009-01-16T16:57:01.057 に答える
1

これは、ビューと同じ条件でトリガーをテーブルに追加する場合に可能です。

トリガー本体は次のようになります。

if (inserted.NUMBER > 5) {
   do something;
}
//do nothing if inserted.NUMBER is not > 5
于 2009-01-16T16:58:23.113 に答える
1

HSQLDB 2.x は、更新可能なビューとトリガー更新可能なビューの両方をサポートしています。

ビューの例は、それ自体で更新可能です。したがって、テーブルの代わりにビューを使用して行を挿入/削除/更新できます。これにより、挿入および更新で NUMBER <= 5 を含む行は許可されません。

ビューでトリガーを定義することもできます。これらのトリガーは、INSTEAD OF INSERT、INSTEAD OF UPDATE、または INSTEAD OF DELETE で定義されます。トリガーの本体で、値を確認し、無効な入力に対して例外をスローするか、行をベース テーブルに挿入できます。

http://hsqldb.org/doc/2.0/guide/triggers-chapt.htmlを参照

于 2011-04-17T09:44:49.373 に答える