Postgres:将模式作为变量传递给带有触发器的函数
Postgres: pass schema as variable to a function with trigger
我会在带有触发器的函数中将架构名称作为变量传递
函数和触发器是这样定义的:
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
根据 Dynamic query:
EXECUTE format('INSERT INTO target_table
SELECT * FROM %I.start_table', NEW.schema_or )
这使用字符串函数 format 创建一个可以执行的查询字符串。查看 format
link 以了解可能的完整解释。在这种情况下 %I
指的是标识符,模式名称。
我会在带有触发器的函数中将架构名称作为变量传递
函数和触发器是这样定义的:
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
根据 Dynamic query:
EXECUTE format('INSERT INTO target_table
SELECT * FROM %I.start_table', NEW.schema_or )
这使用字符串函数 format 创建一个可以执行的查询字符串。查看 format
link 以了解可能的完整解释。在这种情况下 %I
指的是标识符,模式名称。