1

在 postgres 中是否有可能在 CREATE TABLE 上有一个触发器,它将为新创建的表创建触发器?

例如,

CREATE TABLE base_abc(
   ...
) inherits( base );

我想自动将触发器添加到新创建的表base_abc中,例如,它将根据列名计算列值。

同样,是否可以在 ALTER TABLE 上触发,以便可以删除和重新创建触发器?

对于上下文,请参阅将 postgresql 扩展到索引 json 对象的最佳方法是什么?

4

2 回答 2

2

谷歌搜索时发现了这个问题,由于事情发生了变化,决定添加当代答案。从9.3 开始,我们有事件触发器。阅读在线文档以获取更多信息。

你问的可以类似于:

event_tg_example=# CREATE OR REPLACE FUNCTION add_tg_fn()
        RETURNS event_trigger LANGUAGE plpgsql AS $f$
DECLARE
    obj record;
BEGIN
  FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands()
  LOOP
  execute format('create function %I() returns trigger as $tgf$ begin raise info %L, $i$here$i$; return old; end $tgf$ language $l$plpgsql$l$', 'blah_'||obj.objid::regclass,'%');
  execute format ('CREATE TRIGGER tg_blah BEFORE DELETE ON %I FOR EACH ROW EXECUTE PROCEDURE %I();', obj.objid::regclass, 'blah_'||obj.objid::regclass);

  END LOOP;
END
$f$
;
CREATE FUNCTION
event_tg_example=# CREATE EVENT TRIGGER add_tg_tg
   ON ddl_command_end
WHEN TAG IN ('CREATE TABLE')
   EXECUTE PROCEDURE add_tg_fn()
;
CREATE EVENT TRIGGER
event_tg_example=# create table t(i int);
CREATE TABLE
event_tg_example=# insert into t values (1);
INSERT 0 1
event_tg_example=# delete from t where i = 1;
INFO:  here
DELETE 1
event_tg_example=#

请注意,这只是一个工作示例,请勿盲目复制/粘贴

于 2020-11-10T15:29:59.553 回答
1

不要认为有一种方法可以使用 PostgreSQL 内置函数来实现这样的“触发器”,但您绝对可以编写一个存储函数来执行您想要的操作 - 即创建一个派生表,然后在该表上创建一个触发器。

您也可以为 ALTERing 表编写一个。

于 2012-06-15T08:06:43.817 回答