我寻找一个在创建表后触发的事件触发器。我在这里找到了一些好的职位并做了一些测试。我的问题是什么都没有发生,没有错误,也没有输出。所以请给我一些建议我做错了什么。这是我的密码。
我是新来的博士后,来自甲骨文,所以请原谅我这个可能是“简单”的问题。
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表中!但什么也没发生。我怎样才能检查触发器是否被触发。或者如何调试函数?
谢谢你的时间和建议。
最佳答案
函数返回一组行。触发器函数必须准备好接受多行,例如:
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;
pg_event_trigger_ddl_commands()
不足以用于char(20)
,请使用object_identity
: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)
序列上有两个动作,第一个是对其进行克里特化,另一个是用
text
设置owned by
。