触发函数参数PLSH

时间:2017-06-09 08:42:06

标签: postgresql function shell triggers

我创建了一个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都正常工作。

2 个答案:

答案 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');