我创建了一个shell脚本,它接受一个整数参数给我发邮件。
现在我尝试在我的psql数据库上创建一个触发器,该触发器使用plsh extension发送插入行的id,该行将触发器触发到我的shell脚本。
所以我创建了一个函数sendMailContact()和一个触发器mailContact:
TRIGGER mailContact:
CREATE TRIGGER mailcontact
AFTER INSERT
ON contact
FOR EACH ROW
EXECUTE PROCEDURE sendmailcontact(NEW);
功能sendMailContact:
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都正常工作。
答案 0 :(得分:0)
您可以在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 is'$ arg'” DONE ...
答案 1 :(得分:0)
您不需要将任何变量传递给触发函数,只需使用bash $0
.. $n
变量(值与列定义顺序相同)即可。
这是一个完整的小型演示:
CREATE TABLE demo_table(column1 varchar, column2 varchar);
CREATE FUNCTION demo_trigger_fn() RETURNS trigger AS $$
#!/bin/sh
# Prints on stderr for demo purposes
>&2 echo "column1=$1"
>&2 echo "column2=$2"
exit 0
$$ LANGUAGE plsh;
CREATE TRIGGER demo_trigger
AFTER INSERT ON demo_table
FOR EACH ROW
EXECUTE PROCEDURE demo_trigger_fn();
INSERT INTO demo_table(column1, column2) VALUES('value1', 'value2');