是否可以将内置函数作为参数传递给触发器?

Is it possible to pass a built in function as an argument to a trigger?

我根据以下触发器产生此错误来问这个问题:

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.'));

问题似乎是由于我传递了一个连接函数作为我的第二个参数,或者更确切地说,我没有正确传递它。非常感谢您帮助确定问题的原因是两者中的哪一个。

问题实际上来自 " 在串联机制以及对象命名中的使用。

我认为你可以完全避免使用 " :

EXECUTE PROCEDURE public.processBlogPostApproval('Blog Post Approval', concat('Your blog post, "', (SELECT Title FROM public.BlogPosts WHERE PostID == NEW.PostID), '" has been approved.'));

有时 easiest/cleanest 做某事的方法是 --- 最好不要去做。这似乎是这里的情况。您遇到的问题是将消息传递给触发器函数,使其格式正确。好吧,因为 trigger function 必须在没有参数的情况下定义。

A trigger procedure is created with the CREATE FUNCTION command, declaring it as a function with no arguments and a return type of trigger.

不要这样做。在触发器函数中构建消息。它实际上使那里的代码更容易(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);