[英]Running system command with argument in a PostgreSQL function
我不確定我是否具體在問題中,但是我在創建運行Linux shell命令的Postgres函數時遇到了一個問題,其中有一個細節:它是插入后觸發器中的一個函數,我需要使用一些NEW
列。
在MySQL中,使用插件“MySQL UDF”非常簡單,觸發器的工作方式如下:
BEGIN
DECLARE result int(10);
SET result = sys_exec('/usr/bin/php /var/www/html/.../regras.php NEW.uniqueid NEW.linkedid NEW.eventtype');
END
但是在PostgreSQL上我嘗試了PL / sh語言,它可以運行任何shell腳本,所以我編寫了以下函數:
CREATE FUNCTION tarifador_func2() RETURNS TRIGGER
LANGUAGE plsh
AS $$
#!/bin/sh
/usr/bin/php /var/www/html/...regras.php NEW.uniqueid NEW.linkedid NEW.eventtype
$$;
它確實以正確的方式執行.php文件,問題是語言無法識別我作為PHP參數提供的NEW
變量,所以在args[]
我得到的是"NEW.uniqueid"
, "NEW.linkedid"
和"NEW.eventtype"
。
所以,任何人都知道如何在PL / sh中正確使用NEW
參數? 另一種可能的解決方案可能是通過創建觸發器的參數手動設置我需要的三個值,但是不允許在參數中使用NEW
。
您可以在plsh觸發器中訪問某些值。
所以你使用參數獲得這些值,比如$ 1,$ 2
你的功能看起來有點像這樣:
CREATE FUNCTION tarifador_func2() RETURNS TRIGGER
LANGUAGE plsh
AS $$
#!/bin/sh
/usr/bin/php /var/www/html/...regras.php $3 $6 $1
$$;
請注意,我沒有使用$1 $2 $3
,這是因為plsh
擴展將所有列轉儲到參數中,以便在表中聲明它們。 所以你可能會做一些像INSERT INTO table1 (column3) VALUES (6);
假設這是表中的第三列,它將在plsh
$3
。
作為旁注,觸發器的元數據可通過env vars獲得。
據我所知,你無法訪問PL / sh中的NEW
和OLD
元組。
為此,我會使用PL / Perl或PL / Python 。
這是PL / Python中的一個例子:
CREATE OR REPLACE FUNCTION pytrig() RETURNS trigger
LANGUAGE plpythonu AS
$$import os
os.system("/usr/bin/php /home/laurenz/hello.php '" + TD["new"]["val"] + "'")$$;
CREATE TABLE test (id integer PRIMARY KEY, val text);
CREATE TRIGGER pytrig AFTER INSERT ON test FOR EACH ROW
EXECUTE PROCEDURE pytrig();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.