简体   繁体   English

postgres事件触发器和功能不起作用

[英]postgres event trigger and function not working

i looked for a event trigger which fired up after creation of a table. 我寻找了创建表后触发的事件触发器。 I found some good posts here and do some test. 我在这里找到了一些不错的帖子,并做了一些测试。 My problem is that nothing happens, no errors nor output. 我的问题是什么也没有发生,没有错误也没有输出。 So please give some advice what i do wrong. 所以,请给我一些建议,我做错了什么。 Here my code. 这是我的代码。 I'am complete new in postgres, come from oracle, so please forgive me for this maybe "simple" question. 我是来自oracle的postgres的新手,所以请原谅我这个“简单”的问题。

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();

So in this testcase i want to put the tablename of the newly createt table in the table createt! 因此,在这个测试用例中,我想将新创建的表的表名放在表createt中! But nothing happens. 但是什么也没发生。 How can i check if the trigger is fired up. 我如何检查触发器是否已启动。 Or how can i debug the function? 或者我该如何调试该功能?

Thanks for your time and advices. 感谢您的宝贵时间和建议。

The function pg_event_trigger_ddl_commands() returns set of rows. 函数pg_event_trigger_ddl_commands()返回行集。 The trigger function must be ready to accept more than a single row, eg: 触发函数必须准备好接受多个行,例如:

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) is not enough for object_identity , use text : char(20)对于object_identity来说还不够,请使用text

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

What happens when you create a table with serial primary key? 用串行主键创建表时会发生什么?

create table my_table(id serial primary key);

Let's check: 让我们检查:

select *
from createt

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

There are two actions on the sequence, first to crete it and the other to set owned by with alter sequence . 对序列有两个操作,一个是创建序列,另一个是owned by alter sequence设置为owned by

thanks for your advice. 谢谢你的建议。 Very good explanation about the rowset for object_identity. 关于object_identity的行集的很好的解释。 But why there are 4 rows in the table createt. 但是为什么表createt中有4行。 I would expect 3 (tablename, Primary key name, index_name). 我期望3(表名,主键名,索引名)。 Why there is the "my_table_id_seq" two times insert? 为什么两次插入“ my_table_id_seq”?

So i used your code an try it for me but now i get erros that the function pg_event_trigger_ddl_commands does not exist! 所以我用您的代码尝试了一下,但是现在我得到错误消息,函数pg_event_trigger_ddl_commands不存在!

marcel=# DROP TABLE createt;
FEHLER:  Tabelle »createt« existiert nicht
marcel=# CREATE TABLE createt (tname text);
CREATE TABLE
marcel=#
marcel=# CREATE OR REPLACE FUNCTION insert()
marcel-# RETURNS event_trigger
marcel-# AS $$
marcel$# BEGIN
marcel$# INSERT INTO createt
marcel$# SELECT object_identity
marcel$# FROM pg_event_trigger_ddl_commands();
marcel$# END;
marcel$# $$
marcel-# LANGUAGE plpgsql;
CREATE FUNCTION
marcel=# CREATE EVENT TRIGGER insert_event ON ddl_command_end
marcel-# WHEN TAG IN ('CREATE TABLE')
marcel-# EXECUTE PROCEDURE insert();
CREATE EVENT TRIGGER
marcel=#
marcel=#
marcel=# create table my_table(id serial primary key);
FEHLER:  Funktion pg_event_trigger_ddl_commands() existiert nicht
ZEILE 3: FROM pg_event_trigger_ddl_commands()
              ^
TIP:  Keine Funktion stimmt mit dem angegebenen Namen und den Argumenttypen überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen.
ANFRAGE:  INSERT INTO createt
SELECT object_identity
FROM pg_event_trigger_ddl_commands()
KONTEXT:  PL/pgSQL-Funktion insert() Zeile 3 bei SQL-Anweisung
marcel=#
marcel=# select * from createt;
 tname
-------
(0 Zeilen)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM