遍历所有用户表并在每个表中插入行

时间:2015-10-29 19:27:41

标签: postgresql plpgsql

由于某种原因,我无法弄清楚这一点。我在PostgreSQL中有一个单独的模式,用于连接到服务器的每个用户的通知相关表。我的计划是让每个用户创建一个TEMP表来接收额外的通知信息,因为Xojo不支持PostgreSQL有效负载。
我觉得我已经开始接近所以我只是发布我的触发器功能中的代码。

    DECLARE
        my_table    RECORD;
    BEGIN       
        FOR my_table IN 
            SELECT table_name
            FROM   information_schema.tables
            WHERE  table_schema = 'information_schema'
        LOOP
            INSERT INTO my_table.table_name (effected_row_id)
                VALUES (NEW.effected_row_id);
        END LOOP;
    END;

告诉我,如果我错了,但我相信我的主要问题是弄清楚如何使用INSERT语句中从SELECT语句返回的表名。

编辑: 这是我目前的触发功能

-- Function: notification.my_insert_trigger_function()

-- DROP FUNCTION notification.my_insert_trigger_function();

CREATE OR REPLACE FUNCTION notification.my_insert_trigger_function()
  RETURNS trigger AS
$BODY$DECLARE
    my_table    RECORD;
BEGIN       
    FOR my_table IN 
        SELECT table_name
        FROM   information_schema.tables
        WHERE  table_schema = 'notification' AND table_name <> 'notification_global' AND table_name <> 'switcher'
    LOOP
        EXECUTE(FORMAT($f$
        INSERT INTO %s (effected_row_username)
            VALUES (%s);
        $f$, 'notification.' || my_table.table_name, NEW.effected_row_username));
    END LOOP;
RETURN new;
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION notification.my_insert_trigger_function()
  OWNER TO serveradmin;

1 个答案:

答案 0 :(得分:1)

您需要在触发器功能中使用dynamic commands。 功能format()通常非常有用。

DECLARE
    my_table    RECORD;
BEGIN       
    FOR my_table IN 
        SELECT table_name
        FROM   information_schema.tables
        WHERE  table_schema = 'information_schema'
    LOOP
        EXECUTE(FORMAT($f$
        INSERT INTO %s (effected_row_id)
            VALUES (%s);
        $f$, my_table.tablename, NEW.effected_row_id));
    END LOOP;
END;