postgresql - 触发函数参数 PLSH

标签 postgresql function shell triggers

我创建了一个 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/

相关文章:

带有 JDBC 参数标记的 Postgresql upsert

mysql - 数据库特定迁移代码

php - 我在哪里放置我的自定义类和函数在 Laravel 中

linux - 将 STDerr 和 STDout 放入 bash 脚本内的日志文件中

postgresql - 如何在另一个过程中调用存储过程并在Postgresql的同一个过程中使用它的结果?

python - psycopg2 "TypeError: not all arguments converted during string formatting"

C - 为什么我的函数返回 NULL?

javascript - 从动态外部文件运行 Nodejs 函数

bash - 如何在unix中通过计数获取组

shell - 将挂载的服务器添加到 Ubuntu 文件管理器侧面板