如何解决postgres中表列中的异常行为
| 我目前正在使用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中有什么我可以用来确定对该表执行哪些查询/进程的吗?
解决方法
您确定已经发布了所有需要的内容吗?关于member_modification的两个查询建议在两者之间运行一个单独的查询,该查询将is_modified设置回false。
您可以在
member_modification
中添加text[]
字段,例如query_trace text[] not null default \'{}\'
,然后在该表的每一行上加上一个before insert / update触发器,其内容类似于:
NEW.query_trace := NEW.query_trace || current_query();
如果8.3中没有current_query(),请参见以下内容:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。