在 postgresql 中,是否可以在 CREATE TABLE 上使用触发器为表创建触发器



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

例如

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

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

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

有关上下文,请参阅扩展 PostgreSQL 以索引 JSON 对象的最佳方法是什么?

不要认为有办法使用 PostgreSQL 内置函数实现这样的"触发器",但你绝对可以编写一个存储函数来做你想做的事——即创建一个派生表,然后在该表上创建一个触发器。

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

在谷歌搜索时发现了这个问题,因为事情发生了变化,决定添加当代答案。从 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=#

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

相关内容

  • 没有找到相关文章

最新更新