postgres-使用参数创建触发器函数

时间:2019-02-07 07:24:31

标签: postgresql plpgsql database-trigger

我想知道是否可以使用参数创建触发函数,因为该函数的逻辑相同,但是可能只是插入到不同的表和列名中。

功能如下:

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();

2 个答案:

答案 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();