[英]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.