问题:postgres 事件触发器和函数不起作用

我寻找一个在创建表后触发的事件触发器。我在这里找到了一些不错的帖子并进行了一些测试。我的问题是没有任何反应,没有错误也没有输出。所以请给我一些建议,我做错了什么。这是我的代码。我是postgres的新手,来自oracle,所以请原谅我这个可能“简单”的问题。

create table createt (tname char(20));

CREATE OR REPLACE FUNCTION insert()
RETURNS event_trigger
AS $$
DECLARE r RECORD;
BEGIN
r := pg_event_trigger_ddl_commands();
INSERT INTO createt VALUES(r.object_identity);
END;
$$
LANGUAGE plpgsql;

CREATE EVENT TRIGGER insert_event ON ddl_command_end
WHEN TAG IN ('CREATE TABLE')
EXECUTE PROCEDURE insert();

所以在这个测试用例中,我想把新创建的表的表名放在创建的表中!但什么也没有发生。如何检查触发器是否已启动。或者我该如何调试该功能?

感谢您的时间和建议。

解答

函数pg_event_trigger_ddl_commands()返回一组行。触发器函数必须准备好接受多于一行,例如:

CREATE OR REPLACE FUNCTION insert()
RETURNS event_trigger
AS $$
BEGIN
    INSERT INTO createt 
    SELECT object_identity
    FROM pg_event_trigger_ddl_commands();
END;
$$
LANGUAGE plpgsql;

char(20)object_identity不够用,用text:

DROP TABLE createt;
CREATE TABLE createt (tname text);

当您使用串行主键创建表时会发生什么?

create table my_table(id serial primary key);

让我们检查:

select *
from createt

         tname          
------------------------
 public.my_table_id_seq
 public.my_table
 public.my_table_pkey
 public.my_table_id_seq
(4 rows)    

序列上有两个动作,第一个是 crete 它,另一个是用alter sequence设置owned by

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐