Можно ли передать встроенную функцию в качестве аргумента триггера? - PullRequest
0 голосов
/ 13 февраля 2020

Я задаю этот вопрос в свете следующего триггера, вызывающего эту ошибку:

ERROR: syntax error at or near "("
LINE 5: ...cessBlogPostApproval"('Blog Post Approval', concat('Your blo...
^

Рассматриваемый триггер:

CREATE TRIGGER "processBlogPostApproval_AFTER_INSERT"
    AFTER INSERT
    ON public."ApprovedBlogPosts"
    FOR EACH ROW
    EXECUTE PROCEDURE public."processBlogPostApproval"('Blog Post Approval', concat('Your blog post, "', SELECT "Title" FROM public."BlogPosts" WHERE "PostID" == NEW."PostID", '"has been approved.'));

Кажется, проблема возникает из-за того, что что я передал функцию конкатенации в качестве второго аргумента, или, скорее, что я не передал ее правильно. Буду признателен за помощь в определении того, какая из двух причин является причиной проблемы.

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Иногда оказывается, что самый простой / чистый способ сделать что-то - ну, не делать этого. Это похоже на случай здесь. Проблема, с которой вы сталкиваетесь при передаче сообщения в функцию триггера, при правильном форматировании. Хорошо, поскольку функция триггера должна быть определена без параметров.

Процедура триггера создается с помощью команды CREATE FUNCTION, объявляющей ее как функцию без аргументов и возвращаемый тип триггера. ,

Не делай этого. Постройте сообщение в триггерной функции. Это на самом деле делает код там проще (IMO). Вы не предоставили много подробностей, поэтому просто минимальный пример:

-- setup
create table approved_blog_posts( id integer ) ;
create table blog_posts(id integer, title text) ;

insert into blog_posts( id, title) 
values (1 ,'Blog Rant') 
     , (2 ,'Still Rant again')
     , (3 ,'Rambling about nut''en!');

-- trigger function 
create or replace function blog_post_approved()
  returns  trigger
  language plpgsql
as $$
declare
    l_title text; 
begin 
     select title
       into l_title
       from blog_posts
      where id = new.id;

    raise notice 'Your blog post "%" has been approved.',l_title;
    return new;
end; 
$$;  

-- attach trigger to table    
create trigger approved_blog_posts_air
    after insert
    on approved_blog_posts
    for each row
    execute procedure blog_post_approved();

 -- demo/test
 insert into approved_blog_posts(id) values (1),(3);
0 голосов
/ 13 февраля 2020

Проблема на самом деле возникает из-за использования ", в механизме конкатенации, а также при именовании объектов.

Я думаю, что вы можете вообще избежать использования" там так:

EXECUTE PROCEDURE public.processBlogPostApproval('Blog Post Approval', concat('Your blog post, "', (SELECT Title FROM public.BlogPosts WHERE PostID == NEW.PostID), '" has been approved.'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...