是否可以将内置函数作为参数传递给触发器?
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);
我根据以下触发器产生此错误来问这个问题:
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);