Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 从pg_stat_活动查看时不启动触发器_Postgresql_View_Triggers - Fatal编程技术网

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

在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_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,理解我的问题。非常感谢。