【问题标题】:Postgresql, how to add multiple table for one triggerPostgresql,如何为一个触发器添加多个表
【发布时间】:2016-01-15 19:37:16
【问题描述】:

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

【问题讨论】:

    标签: postgresql function triggers


    【解决方案1】:

    创建一个新函数

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

    【讨论】:

    • 谢谢我在找这个。但是我需要在包含特定列名的公共架构中的每个表上执行触发器。如何在我的公共架构中选择所有这些表?
    【解决方案2】:

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

    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;
    

    【讨论】:

      【解决方案3】:

      您需要为每个表定义一个触发器,因此如果您有两个表,则需要两个触发器。

      但是,多个触发器可以使用相同的触发器函数。

      【讨论】:

      • 谢谢,我想,也许有一些功能,反正谢谢回答。
      猜你喜欢
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 2019-05-14
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      相关资源
      最近更新 更多