我想知道是否可以使用参数创建触发函数,因为该函数的逻辑相同,但是可能只是插入到不同的表和列名中。
功能如下:
CREATE OR REPLACE FUNCTION
createInstance(table_name TEXT, column_name TEXT)
RETURNS TRIGGER AS
$BODY$
BEGIN
INSERT INTO
table_name
(
column_name,
account_id
)
VALUES
(
new._id,
new.account_id
);
RETURN new;
END;
$BODY$
language plpgsql;
错误:
ERROR: trigger functions cannot have declared arguments
HINT: The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead.
CONTEXT: compilation of PL/pgSQL function "createinstance" near line 1
示例触发器:
CREATE TRIGGER trig_instanced_item_copy
AFTER INSERT ON creator.items
FOR EACH ROW
EXECUTE PROCEDURE createInstance();
答案 0 :(得分:2)
您没有为触发函数定义参数,但仍可以在CREATE TRIGGER
语句中为其指定参数。
这些参数必须是常量,并且可以通过TG_ARGV
数组用于触发器函数。
这样,您可以为每个表参数化触发器,例如,通过传递触发器应在其上操作的表和列的名称。在这种情况下,您必须在触发器中使用EXECUTE
使用动态SQL。
答案 1 :(得分:0)
无法弄清楚如何动态地执行此操作,因此使用了以下方法:
CREATE OR REPLACE FUNCTION
insertIntoInstancedItem ()
RETURNS TRIGGER AS $BODY$
DECLARE
BEGIN
INSERT INTO
creator.instanced_items
(
item_id,
account_id
)
VALUES
(
new._id,
new.account_id
);
RETURN
*;
END
$BODY$
language plpgsql;
CREATE TRIGGER trig_item_insertion
AFTER INSERT ON creator.items
FOR EACH ROW
EXECUTE PROCEDURE insertIntoInstancedItem();