странное поведение в столбце таблицы в postgres - PullRequest
0 голосов
/ 26 мая 2011

Я сейчас использую postgres 8.3. Я создал таблицу, которая действует как таблица грязных флагов для членов, которые существуют в другой таблице. Я применил триггеры после вставки или обновления в таблицу участников, которые будут вставлять / обновлять запись в таблице изменений со значением true. Триггер, кажется, работает, однако я заметил, что что-то переворачивает логическое значение is_modified. Я понятия не имею, как можно попытаться выделить то, что могло бы его перевернуть.

Функция триггера:

 BEGIN;
     CREATE OR REPLACE FUNCTION set_member_as_modified() RETURNS TRIGGER AS $set_member_as_modified$
  BEGIN
LOOP
  -- first try to update the key
  UPDATE member_modification SET is_modified = TRUE, updated = current_timestamp WHERE "memberID" = NEW."memberID";
  IF FOUND THEN
    RETURN NEW;
  END IF;
  --member doesn't exist in modification table, so insert them
  -- if someone else inserts the same key conncurrently, raise a unique-key failure
  BEGIN
    INSERT INTO  member_modification("memberID",is_modified,updated) VALUES(NEW."memberID", TRUE,current_timestamp);
    RETURN NEW;
  EXCEPTION WHEN unique_violation THEN
    -- do nothing, and loop to try the update again
  END;
END LOOP;
  END;
$set_member_as_modified$ LANGUAGE plpgsql;
COMMIT;

CREATE TRIGGER set_member_as_modified AFTER INSERT OR UPDATE ON members FOR EACH ROW EXECUTE PROCEDURE set_member_as_modified();

Вот sql, который я запускаю, и результаты:

     $CREATE TRIGGER set_member_as_modified AFTER INSERT OR UPDATE ON members FOR EACH ROW EXECUTE PROCEDURE set_member_as_modified(); 

Результаты:

     UPDATE 1
     bluesky=# select * from member_modification;
    -[ RECORD 1 ]---+---------------------------
 modification_id | 14
 is_modified     | t
 updated         | 2011-05-26 09:49:47.992241
 memberID        | 182346

bluesky=# select * from member_modification;
-[ RECORD 1 ]---+---------------------------
modification_id | 14
is_modified     | f
updated         | 2011-05-26 09:49:47.992241
memberID        | 182346

Как вы видите, что-то перевернуло значение is_modified. Есть ли в postgres что-нибудь, что я могу использовать, чтобы определить, какие запросы / процессы действуют в этой таблице?

1 Ответ

1 голос
/ 26 мая 2011

Вы уверены, что разместили все необходимое?Два запроса на member_modification предполагают, что между ними выполняется отдельный запрос, который устанавливает is_modified обратно в false.

Вы можете добавить поле text[] к member_modification, например, query_trace text[] not null default '{}', затем иперед вставкой / обновлением триггера для каждой строки в этой таблице, которая выглядит примерно так:

NEW.query_trace := NEW.query_trace || current_query();

Если current_query () недоступен в 8.3, посмотрите это:

http://www.postgresql.org/docs/8.3/static/monitoring-stats.html

SELECT pg_stat_get_backend_pid(s.backendid) AS procpid,
       pg_stat_get_backend_activity(s.backendid) AS current_query
    FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;

Затем вы можете получить список последующих запросов, которые его затронули:

select query_trace[i] from generate_series(1, array_length(query_trace, 1)) as i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...