Postgresql 从pg_stat_活动查看时不启动触发器
在postgres中,不是真正的在pg_stat_活动上创建触发器,因为我基于pg_stat_活动创建视图并创建触发器Postgresql 从pg_stat_活动查看时不启动触发器,postgresql,view,triggers,Postgresql,View,Triggers,在postgres中,不是真正的在pg_stat_活动上创建触发器,因为我基于pg_stat_活动创建视图并创建触发器 DROP FUNCTION IF EXISTS get_sa() CASCADE; DROP FUNCTION IF EXISTS f_call_count_conn(); DROP FUNCTION IF EXISTS f_update_count_conn(); CREATE OR REPLACE FUNCTION get_sa() RETURNS SETOF pg_st
DROP FUNCTION IF EXISTS get_sa() CASCADE;
DROP FUNCTION IF EXISTS f_call_count_conn();
DROP FUNCTION IF EXISTS f_update_count_conn();
CREATE OR REPLACE FUNCTION get_sa() RETURNS SETOF pg_stat_activity AS
$$ SELECT * FROM pg_catalog.pg_stat_activity; $$
LANGUAGE sql
VOLATILE
SECURITY DEFINER;
CREATE OR REPLACE VIEW pg_stat_activity_allusers AS SELECT * FROM get_sa();
GRANT SELECT ON pg_stat_activity_allusers TO public;
CREATE OR REPLACE FUNCTION f_call_count_conn()
RETURNS TRIGGER AS
$BODY$
BEGIN
IF TG_OP = 'INSERT' THEN
COPY (SELECT time_change, count FROM count_conn) TO '/tmp/query.csv' (format csv, delimiter ';');
RETURN NEW;
ELSIF TG_OP = 'DELETE' THEN
COPY (SELECT time_change, count FROM count_conn) TO '/tmp/query.csv' (format csv, delimiter ';');
RETURN OLD;
END IF;
-- PERFORM f_update_count_conn();
-- RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER t_check_activity_conn
INSTEAD OF INSERT OR DELETE ON pg_stat_activity_allusers
FOR EACH ROW
EXECUTE PROCEDURE f_call_count_conn();
CREATE FUNCTION f_update_count_conn()
RETURNS VOID
AS
$BODY$
BEGIN
insert into count_conn (time_change, count)
values (NOW(), (select count(*)
from pg_stat_activity_allusers));
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
这段代码不起作用,但当我在真实表上替换我的视图pg_stat_activity_allusers并更改此表时,我的触发器起作用。为什么?谢谢大家! 您的代码在Postgres 9.5上对我有效,除了我手动调用f_update_count_conn来填充count_conn之外,因为您不再或不再在任何地方调用它
# select f_update_count_conn();
f_update_count_conn
---------------------
(1 row)
mw=# select * from count_conn;
time_change | count
----------------------------+-------
2017-02-03 17:22:34.846179 | 1
(1 row)
mw=# insert into pg_stat_activity_allusers(datid) values(123456::oid);
INSERT 0 1
mw=#
[1]+ Stopped '/Applications/Postgres.app/Contents/Versions/9.5/bin'/psql -p5432
$ cat /tmp/query.csv
2017-02-03 17:22:34.846179;1
你的代码在Postgres 9.5上对我有效,除了我手动调用f_update_count_conn来填充count_conn之外,因为你不再或不再在任何地方调用它
# select f_update_count_conn();
f_update_count_conn
---------------------
(1 row)
mw=# select * from count_conn;
time_change | count
----------------------------+-------
2017-02-03 17:22:34.846179 | 1
(1 row)
mw=# insert into pg_stat_activity_allusers(datid) values(123456::oid);
INSERT 0 1
mw=#
[1]+ Stopped '/Applications/Postgres.app/Contents/Versions/9.5/bin'/psql -p5432
$ cat /tmp/query.csv
2017-02-03 17:22:34.846179;1
pg_stat_活动不是表,并且没有在其上发生任何类似插入/更新的事件。你想要什么?当pg_stat_活动更改时,插入或删除有关此更改的信息写入我的表。我知道什么是pg_统计_活动视图。官方postgres文档更倾向于在视图中使用而不是插入/更新/删除。pg_stat_活动不是表-您无法在其上捕获插入/删除。您是否希望记录查询?或者用户登录/注销?甚至pg_stat_activity也不仅仅是一个表,您的构建-查看pg_stat_activity_allusers只能在插入到pg_stat_activity_allusers时捕获触发器,当pg_stat_acvtivity中的数据发生更改时不会发生。pg_stat_活动不是表,并且没有发生任何类似插入/更新的事件。你想要什么?当pg_stat_活动更改时,插入或删除有关此更改的信息写入我的表。我知道什么是pg_统计_活动视图。官方postgres文档更倾向于在视图中使用而不是插入/更新/删除。pg_stat_活动不是表-您无法在其上捕获插入/删除。您是否希望记录查询?或者用户登录/注销?甚至pg_stat_activity也不仅仅是一个表,您的构建-查看pg_stat_activity_用户只有在插入到pg_stat_activity_用户时才能捕获插入/删除触发器,而不是在pg_stat_acvtivity中的数据发生更改时。谢谢!我理解我的问题:我不是100%清楚你想要什么,但是你的触发器函数中注释掉的行执行f_update_count_conn;将永远不会被调用,因为您的函数将首先返回。但请将选择时间更改、计数从计数连接复制到“/tmp/query.csv”格式的csv,分隔符“;”;不要太开始。因为对我来说,需要改变pg_状态_活动_诱惑。当我在pg_stat_activity_中插入allusersdatid值123456::oid时;所有的工作。你说你需要改变pg_统计活动是什么意思?COPY语句将在插入或删除视图时运行。我想当更改pg_stat_sctivity my viewchange pg_stat_activity_allusers更改为并启动触发器时会发生什么,但这不会发生,即使pg_stat_activity_allusers已更改。在pg_stat_activity unreal上创建触发器,因为此视图具有权限,而该权限不会绕过。我在网上找到了我基于pg_stat_活动帮助的观点,但我错了。我看到你回答并帮助@Roman Tkachuk,理解我的问题。非常感谢。非常感谢。我理解我的问题:我不是100%清楚你想要什么,但是你的触发器函数中注释掉的行执行f_update_count_conn;将永远不会被调用,因为您的函数将首先返回。但请将选择时间更改、计数从计数连接复制到“/tmp/query.csv”格式的csv,分隔符“;”;不要太开始。因为对我来说,需要改变pg_状态_活动_诱惑。当我在pg_stat_activity_中插入allusersdatid值123456::oid时;所有的工作。你说你需要改变pg_统计活动是什么意思?COPY语句将在插入或删除视图时运行。我想当更改pg_stat_sctivity my viewchange pg_stat_activity_allusers更改为并启动触发器时会发生什么,但这不会发生,即使pg_stat_activity_allusers已更改。在pg_stat_activity unreal上创建触发器,因为此视图具有权限,而该权限不会绕过。我在网上找到了我基于pg_stat_活动帮助的观点,但我错了。我看到你回答并帮助@Roman Tkachuk,理解我的问题。非常感谢。