【问题标题】:Postgres: pass schema as variable to a function with triggerPostgres:将模式作为变量传递给带有触发器的函数
【发布时间】:2022-01-03 18:47:39
【问题描述】:

我会在带有触发器的函数中将模式名称作为变量传递

函数和触发器是这样定义的:

CREATE OR REPLACE FUNCTION test()  RETURNS TRIGGER AS $shp_create$

  BEGIN
    RAISE NOTICE 'NEW: %', NEW;
    IF NEW.log_type = false THEN

        INSERT INTO target_table
        SELECT * FROM $%%NEW.schema_or%%%.start_table 
    
        NEW.log_type := true;

      RETURN NEW;
    END IF;
    RETURN NEW;
  END;

 $test$ LANGUAGE plpgsql;


DROP TRIGGER IF EXISTS test_trigger ON table_log;
CREATE TRIGGER test_trigger BEFORE INSERT ON table_log
  FOR EACH ROW EXECUTE PROCEDURE test();

table_log 是这么定义的:

log_type|schema_or
--------|---------
 false    test

所以函数中的Insert语句变成:

INSERT INTO target_table
SELECT * FROM test.start_table 

【问题讨论】:

    标签: postgresql triggers database-schema


    【解决方案1】:

    每Dynamic query:

    EXECUTE format('INSERT INTO target_table
            SELECT * FROM %I.start_table', NEW.schema_or )
    
    

    这使用字符串函数format 创建一个查询字符串,然后可以执行。查看format 链接以获取有关可能性的完整说明。在这种情况下,%I 指的是一个标识符,即架构名称。

    【讨论】:

    • 不知道为什么:format('INSERT INTO target_table SELECT string_agg(field::varchar,''-'') FROM %I.start_table', 'test' ); 屈服:INSERT INTO target_table SELECT string_agg(field::varchar,'-') FROM test.start_table 不起作用?你得到什么错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多