Postgres - 创建带参数的触发器函数

3
我在想是否可以创建一个带有参数的触发器函数,因为函数的逻辑是相同的,但可能只是插入到不同的表和列名中。
以下是该函数内容:
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();

如果您想要表名是动态的,就不能使用变量作为标识符。您必须使用动态SQL。 - user330315
@a_horse_with_no_name,如果您知道如何使用TG_ARGV,能否给出一个示例? - A. L
2个回答

2
您不需要为触发器函数定义参数,但是您仍然可以在CREATE TRIGGER语句中指定参数。

这些参数必须是常量,并且可以通过TG_ARGV数组传递给触发器函数。

这样,您就可以为每个表参数化触发器,例如通过传递触发器应该操作的表和列的名称。在这种情况下,您将需要在触发器中使用EXECUTE进行动态SQL。

注:Original Answer翻译成“最初的回答”

你能提供一个例子吗?我会用我在网上找到的一个例子更新我的问题。 - A. L
不,这很简单,但需要写相当多的代码。 - Laurenz Albe
@A.L 可以参考这个作为一个很好的例子。对于动态SQL的说明点赞。 - Rafs

1

无法动态地解决它,因此使用了这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接