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

时间:2018-04-26 13:55:20

标签: postgresql function events plsql triggers

我查找了一个在创建表后触发的事件触发器。我在这里发现了一些好帖子并做了一些测试。我的问题是没有任何事情发生,没有错误也没有输出。所以请提出一些建议我做错了什么。在这里我的代码。 我是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();

所以在这个测试用例中我想把新createt表的tablename放在表createt中!但没有任何反应。如何检查触发器是否被触发。或者我该如何调试该功能?

感谢您的时间和建议。

2 个答案:

答案 0 :(得分:0)

函数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)    

让我们检查一下:

owned by

序列上有两个操作,首先是克隆它,另一个是用alter sequence设置$this->pdo->select()->from('orders') ->where('orderid', 'LIKE', '%'.$id.'%', 'OR') ->where('date', 'LIKE', '%'.$date.'%', 'OR') ->where('PRICE', 'LIKE', '%'.$PRICE.'%');

答案 1 :(得分:0)

感谢您的建议。 关于object_identity的行集的非常好的解释。 但是为什么表createt中有4行。我希望3(tablename,主键名,index_name)。为什么有" my_table_id_seq"两次插入?

所以我使用你的代码试试吧,但是现在我得到函数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)