postgresql 如何为一个触发器添加多个表

dsekswqp  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(4)|浏览(127)

我有个问题如何为一个触发器添加多个表?这是可能的吗?或者我应该为两个不同的表再做两个触发器?

sbdsn5lh

sbdsn5lh1#

创建新函数

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';
5lhxktic

5lhxktic2#

为所有表迭代一个触发器
(For外部表示例)

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;
pbwdgjma

pbwdgjma3#

您需要为每个表定义一个触发器,因此如果您有两个表,则需要两个触发器。
但是,多个触发器可以使用相同的触发器功能。

q7solyqu

q7solyqu4#

这个答案可能有点晚,但我有另一种方法来使用多个表只有一个触发器。
我有多个生产表,每个生产表都有一个插入触发器,它调用我的data_production_add()。
在这个函数中,我使用TG_TABLE_NAME来知道哪个表正在调用触发器,下面是一个例子:

IF (TG_TABLE_NAME = 'production_alimentation') THEN
            prot_cmd_var = 47;
        ELSIF (TG_TABLE_NAME = 'production_froid') THEN
            prot_cmd_var = 16;
        ELSIF (TG_TABLE_NAME = 'production_chauffage') THEN
            prot_cmd_var = 9;
        ELSIF (TG_TABLE_NAME = 'production_electrique_puissance' OR TG_TABLE_NAME = 'production_electrique_consommation') THEN
            prot_cmd_var = 20;

通过这样做,我可以插入一个“production_stats”与常见的信息,如id_device或id_user,但不同的值的prot_cmd_var
希望这能帮助到一些人

相关问题