Как использовать триггеры PostgreSQL? - PullRequest
3 голосов
/ 22 октября 2010

Я пытаюсь использовать триггеры PostgreSQL в моем приложении rails.Поэтому я попытался использовать эту миграцию, где выполнение триггеров предположительно просто:

-- 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

Но это ничего не изменило.Я не знаю, где написать процедуру или функцию, если я собираюсь использовать ее здесь ...

Ответы [ 3 ]

6 голосов
/ 14 января 2012

«Создание триггера » состоит из двух шагов в 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();

Если вы отбрасываете таблицу, все присоединенные триггеры удаляются вместе с ней.Нет необходимости отбрасывать их отдельно.

2 голосов
/ 22 октября 2010

Работает ли что-то подобное?Создание функции и последующее выполнение функции для триггера:

   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
0 голосов
/ 19 апреля 2017

Драгоценный камень hair_trigger - хороший способ управления созданием триггеров.

Вот пример из документации 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
...