3

Rails アプリで PostgreSQL トリガーを使用しようとしています。そこで、トリガーの実行がおそらく簡単なこの移行を使用してみました。

-- class AddTriggersToProducts < ActiveRecord::Migration
  def self.up
    table :products
    execute %q{
        create trigger trig1 before insert on products for each row
        begin 
        price = price + 5
        end;
        }
  end

  def self.down
    execute 'DROP TRIGGER trig1'
  end
end

しかし、これは何も変わりませんでした。ここで使用する場合、プロシージャまたは関数をどこに記述すればよいかわかりません...

4

3 に答える 3

8

「トリガーの作成」は、PostgreSQLでの2 つのステップで構成されます。

1.)トリガー関数を作成します- 特別な戻り値でtrigger:

CREATE FUNCTION trg_update_prod_price()
  RETURNS trigger AS
$func$
BEGIN
   NEW.price := NEW.price + 5;
   RETURN NEW;
END
$func$  LANGUAGE plpgsql;

複数のトリガーで同じトリガー機能を使用できます。

2.)既存のトリガー関数を呼び出すトリガーを作成します。

CREATE TRIGGER update_prod_price
BEFORE INSERT ON products
FOR EACH ROW EXECUTE PROCEDURE trg_update_prod_price();

「トリガーをドロップする」 (トリガー関数を意味する) には、まずそれを参照するすべてのトリガーをドロップし、次にトリガー関数自体をドロップする必要があります。

DROP TRIGGER update_prod_price ON products;
DROP FUNCTION trg_update_prod_price();

テーブルを削除すると、接続されているすべてのトリガーも一緒に削除されます。それらを個別にドロップする必要はありません。

于 2012-01-14T02:11:28.237 に答える
2

このようなものは機能しますか?関数を作成してから、トリガーの関数を実行します。

   def self.up 
     execute %q{
       create or replace function update_price() returns trigger as $$
         begin
           NEW.price := NEW.price + 5;
           return NEW;
         end;
       $$ language plpgsql }

      execute %{ create trigger trig1 before insert on products for each row execute function update_price()}
  end
于 2010-10-22T15:45:51.873 に答える