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=#
请注意,这只是一个工作示例,不要盲目复制/粘贴