postgres - создание триггерных функций с аргументами - PullRequest
0 голосов
/ 07 февраля 2019

Мне было интересно, возможно ли создать функцию триггера с аргументами, поскольку логика функции та же, но она может просто вставляться в разные таблицы и имена столбцов.

Вот функция:

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 голосов
/ 07 февраля 2019

Не могу понять, как это сделать динамически, поэтому использовал это:

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();
0 голосов
/ 07 февраля 2019

Вы не определяете параметры для функции триггера, но вы все равно можете указать ей аргументы в операторе CREATE TRIGGER.

Эти аргументы должны быть константами и будут доступны для функции триггера черезмассив TG_ARGV.

Таким образом, вы можете параметризовать триггер для каждой таблицы, например, передавая имена таблиц и столбцов, с которыми должен работать триггер.В этом случае вам придется использовать динамический SQL, используя EXECUTE в триггере.

...