我创建了一个 shell 脚本,它接受一个整数参数来给我发邮件。
现在我尝试在我的 psql 数据库上创建一个触发器,它使用 plsh extension 将触发触发器的插入行的 ID 发送到我的 shell 脚本.
所以我创建了一个函数 sendMailContact() 和一个触发器 mailContact :
触发邮件联系人:
CREATE TRIGGER mailcontact
AFTER INSERT
ON contact
FOR EACH ROW
EXECUTE PROCEDURE sendmailcontact(NEW);
函数发送邮件联系人:
CREATE OR REPLACE FUNCTION sendmailcontact()
RETURNS trigger AS '
#!/bin/sh
/home/me/Scripts/sendMailContact.sh NEW.id'
LANGUAGE plsh;
但是“NEW.id”似乎不能正常工作(这里是代码的一部分,因为我无法将它作为变量传递)。根据这个答案:https://stackoverflow.com/a/35654749/5591761 从官方 README 文件来看,NEW.x 必须可以工作,但在这里不行。
我还尝试了 TG_ARGV[0],它用于在标准 SQL 语言中将参数从触发器传递到函数,但我真的不知道如何在这里使用它。也许 plsh 扩展为我们提供了一个新的论证表,但我没有找到它。
最后我尝试将 id 直接传递给函数并在我的函数上使用它和 $1 但它也不起作用
如何将插入行的 ID(整数)传递给我的函数并将其用作我的 shell 脚本的参数?
----- 编辑:-----
在查看了您提供给我的答案后,我编辑了我的函数:
CREATE OR REPLACE FUNCTION sendmailcontact()
RETURNS trigger AS
$BODY$
#!/bin/sh
/home/pi/Scripts/sendMailContact.sh $2
$BODY$
LANGUAGE plsh
我使用 $2 因为 id 是 INSERT 的第一列(id 是一个串行自动增量,但我认为它也是 INSERT 的一部分?)
然后触发:
CREATE TRIGGER mailcontact
AFTER INSERT
ON contact
FOR EACH ROW
EXECUTE PROCEDURE sendmailcontact(NEW);
还是不行。
但我注意到,如果激活了触发器,INSERT 将不再起作用。我的表中没有添加任何内容。
如果您问脚本或触发器是否工作,答案是肯定的,在此之前我编写了几乎相同的触发器和函数,当我在联系人中插入时触发器调用函数。该函数只是向我发送一封没有任何参数的邮件,并且邮件和 INSERT 正在运行。
最佳答案
你可以在plsh中查看关于触发器的文档
例子:
https://github.com/petere/plsh/blob/master/test/sql/trigger.sql
输出:
https://github.com/petere/plsh/blob/master/test/expected/trigger.out
也许您的问题是关于触发器中的这段代码部分: ... 对于 arg 做 echo "Arg 是 '$arg'" 完毕 ...
关于postgresql - 触发函数参数 PLSH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44453206/