在 postgres 中是否有可能在 CREATE TABLE 上有一个触发器,它将为新创建的表创建触发器?
例如,
CREATE TABLE base_abc(
...
) inherits( base );
我想自动将触发器添加到新创建的表base_abc
中,例如,它将根据列名计算列值。
同样,是否可以在 ALTER TABLE 上触发,以便可以删除和重新创建触发器?
对于上下文,请参阅将 postgresql 扩展到索引 json 对象的最佳方法是什么?
在 postgres 中是否有可能在 CREATE TABLE 上有一个触发器,它将为新创建的表创建触发器?
例如,
CREATE TABLE base_abc(
...
) inherits( base );
我想自动将触发器添加到新创建的表base_abc
中,例如,它将根据列名计算列值。
同样,是否可以在 ALTER TABLE 上触发,以便可以删除和重新创建触发器?
对于上下文,请参阅将 postgresql 扩展到索引 json 对象的最佳方法是什么?
谷歌搜索时发现了这个问题,由于事情发生了变化,决定添加当代答案。从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=#
请注意,这只是一个工作示例,请勿盲目复制/粘贴
不要认为有一种方法可以使用 PostgreSQL 内置函数来实现这样的“触发器”,但您绝对可以编写一个存储函数来执行您想要的操作 - 即创建一个派生表,然后在该表上创建一个触发器。
您也可以为 ALTERing 表编写一个。