【问题标题】:Bash: Calling bash script from postgresql trigger functionBash:从 postgresql 触发函数调用 bash 脚本
【发布时间】:2014-06-11 16:53:41
【问题描述】:

我正在从 postgresql 中的触发函数调用 bash 脚本。在 SQL 中更新表中的值(log_interval)后调用该脚本。

从调用的脚本中的表中读取更改的值(log_interval)并存储在文件(interval.txt)中。如果我打开文件,我会看到 log_interval 的旧值,而不是 interval.txt 文件中的新值。

下面是我正在使用的代码 sn-p:

触发功能:

CREATE OR REPLACE FUNCTION update_upload_interval()
RETURNS trigger AS
$BODY$
#!/bin/sh
exec /home/User/ReadInterval.sh &
$BODY$
LANGUAGE plsh VOLATILE

触发器:

CREATE TRIGGER assign_new_interval
AFTER UPDATE OF log_interval
ON table_interval
FOR EACH ROW
WHEN ((old.log_interval IS DISTINCT FROM new.log_interval))
EXECUTE PROCEDURE update_upload_interval();

脚本代码:

function readinterval() {
logperiod=$(psql -c "select log_interval from table_interval where id=1;" -t  $database_name)
echo "$logperiod" > /home/User/interval.txt
}

对编写脚本和使用 SQL 不熟悉。让我知道解决方案。提前致谢。

【问题讨论】:

  • 使用 PL/SH 并从服务器调用 shell 脚本通常是一个非常糟糕的主意。尽可能使用LISTENNOTIFY 来获得一个辅助守护进程来代替。

标签: bash postgresql postgresql-9.1


【解决方案1】:

除非这里没有显示更多代码,否则仅调用ReadInterval.sh 不会做任何事情,因为它只是一个函数声明。此外,还有一个未设置的变量 $database_name

CREATE OR REPLACE FUNCTION update_upload_interval()
RETURNS trigger AS
$BODY$
#!/bin/sh
database_name=???
psql -c "select log_interval from table_interval where id=1;" -t  $database_name > /home/User/interval.txt
$BODY$
LANGUAGE plsh VOLATILE

【讨论】:

  • 可能我在这里谈论的是空白,但这似乎是一个不能被关闭的有效问题。为什么它获得了三张赞成票,但我无法理解。
猜你喜欢
  • 2019-01-04
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
相关资源
最近更新 更多