【发布时间】:2016-01-15 19:37:16
【问题描述】:
我有一个问题:如何为一个触发器添加多个表? 这可能吗,还是我应该为 2 个不同的表再做 2 个触发器?
【问题讨论】:
标签: postgresql function triggers
我有一个问题:如何为一个触发器添加多个表? 这可能吗,还是我应该为 2 个不同的表再做 2 个触发器?
【问题讨论】:
标签: postgresql function triggers
创建一个新函数
CREATE OR REPLACE FUNCTION updated_timestamp_func()
RETURNS TRIGGER
LANGUAGE plpgsql AS
'
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
';
然后为每个具有 updated_at
列的表创建一个触发器DO $$
DECLARE
t text;
BEGIN
FOR t IN
SELECT table_name FROM information_schema.columns WHERE column_name = 'updated_at'
LOOP
EXECUTE format('CREATE TRIGGER trigger_update_timestamp
BEFORE UPDATE ON %I
FOR EACH ROW EXECUTE PROCEDURE updated_timestamp_func()', t,t);
END loop;
END;
$$ language 'plpgsql';
【讨论】:
为所有表迭代一个触发器
(例如外部表)
DO
$$
DECLARE
r RECORD;
BEGIN
FOR r IN SELECT *
FROM information_schema.tables
where table_type = 'FOREIGN TABLE'
and table_schema = 'public'
and table_name <> 'django_migrations'
LOOP
RAISE NOTICE 'CREATE TRIGGER FOR: %', r.table_name::text;
EXECUTE 'CREATE TRIGGER trg_insert_ids
BEFORE INSERT
on ' || r.table_name || ' FOR EACH ROW
EXECUTE PROCEDURE insert_ids();';
END LOOP;
END;
$$ LANGUAGE plpgsql;
【讨论】:
您需要为每个表定义一个触发器,因此如果您有两个表,则需要两个触发器。
但是,多个触发器可以使用相同的触发器函数。
【讨论】: