Триггер Postgres работает для INSERT, а не для DELETE - PullRequest
1 голос
/ 28 марта 2012

У меня проблема с триггером.Я создал триггер и функцию, чтобы отслеживать, сколько строк используется каждым пользователем в моей БД.Часть INSERT триггера и функции работают правильно, но DELETE ничего не делает.Когда я вставляю строки в свое приложение, количество строк увеличивается, когда я удаляю, количество строк не изменяется.

Вот ТАБЛИЦА, в которой я храню количество строк:

Table "public.rowcount"
   Column   |  Type   | Modifiers 
------------+---------+-----------
 user__id   | integer | not null
 table_name | text    | not null
 total_rows | bigint  | 

Вот мой ТРИГГЕР:

CREATE TRIGGER countrows_m_time
  AFTER INSERT OR DELETE on m_time
  FOR EACH ROW EXECUTE PROCEDURE count_rows_m_time();

А вот ФУНКЦИЯ:

CREATE OR REPLACE FUNCTION count_rows_m_time()
RETURNS TRIGGER AS
'  
   BEGIN
      IF TG_OP = ''INSERT'' THEN
        UPDATE rowcount
          SET total_rows = total_rows + 1
          WHERE table_name = TG_RELNAME
          AND user__id = (SELECT user__id from vi_m_time_users where m_value_id = NEW.m_value_id);
      ELSIF TG_OP = ''DELETE'' THEN
         UPDATE rowcount
            SET total_rows = total_rows - 1
            WHERE table_name = TG_RELNAME
            AND user__id = (SELECT user__id from vi_m_time_users where m_value_id = OLD.m_value_id);
      END IF;
      RETURN NULL;
   END;
' LANGUAGE plpgsql;

Есть идеи?Большое спасибо, Ши

Ответы [ 3 ]

2 голосов
/ 29 марта 2012

После моего исходного поста я вернулся, чтобы упростить проблему. Я разделил TRIGGER и FUNCTION на отдельные операции INSERT и DELETE. И INSERT TRIGGER, и FUNCTION продолжают корректно работать как триггер AFTER. Поэтому я исключил это из поста. Вот упрощенная проблема с триггером DELETE.

Вот мой новый ТРИГГЕР:

CREATE TRIGGER remrows_m_int
  BEFORE DELETE on m_int
  FOR EACH ROW EXECUTE PROCEDURE rem_rows_m_int();

А вот и моя новая ФУНКЦИЯ:

CREATE OR REPLACE FUNCTION rem_rows_m_int()
RETURNS TRIGGER AS
'
   BEGIN
      IF TG_OP = ''DELETE'' THEN
         UPDATE rowcount
            SET total_rows = total_rows - 1
            WHERE table_name = TG_RELNAME
            AND user__id = (SELECT user__id from vi_m_int_users where result_id = OLD.result__id);
      END IF;
      RETURN OLD;
   END;
' LANGUAGE plpgsql;

Этот триггер теперь работает, если я удаляю строки в таблице m_int. Проблема с триггером AFTER так и не была решена, но использование BEFORE с RETURN OLD, похоже, является хорошей заменой. С помощью жесткого кодирования определенных переменных проблема была связана с использованием OLD.result__id в функции.

0 голосов
/ 17 ноября 2013
CREATE OR REPLACE FUNCTION count_rows_m_time()
RETURNS TRIGGER AS $count_rows_m_time$
 DECLARE
   BEGIN
      IF (TG_OP = 'INSERT') THEN
        UPDATE rowcount
          SET total_rows = (total_rows + 1)
          WHERE table_name = TG_RELNAME
          AND user_id = (SELECT user_id FROM vi_m_time_users WHERE m_value_id = NEW.m_value_id);
      ELSIF (TG_OP = 'DELETE') THEN
         UPDATE rowcount
            SET total_rows = (total_rows - 1)
            WHERE table_name = TG_RELNAME
            AND user_id = (SELECT user_id FROM vi_m_time_users WHERE m_value_id = OLD.m_value_id);
      END IF;
      RETURN NULL;
   END;
$count_rows_m_time$ LANGUAGE plpgsql;

* я так думаю

0 голосов
/ 29 марта 2012

Возврат NULL отменяет операции INSERT / DELETE. (Вы можете использовать его для ссылочной целостности, слишком сложной для применения с простым ограничением.)

Вы хотите вернуть OLD из DELETE и NEW из INSERT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...