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 中包括两个步骤:

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 回答
1

hair_trigger gem 是管理触发器创建的好方法

这是 hair_trigger 文档中的一个示例:

class AccountUser < ActiveRecord::Base
  trigger.after(:insert) do
    "UPDATE accounts SET user_count = user_count + 1 WHERE id = NEW.account_id;"
  end

  trigger.after(:update).of(:name) do
    "INSERT INTO user_changes(id, name) VALUES(NEW.id, NEW.name);"
  end
end
于 2017-04-18T22:35:23.303 回答