簡體   English   中英

在PostgreSQL函數中使用參數運行系統命令

[英]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觸發器中訪問某些值。

  • UPDATE僅提供OLD
  • INSERT僅提供NEW(duh)
  • 刪除我沒有測試

所以你使用參數獲得這些值,比如$ 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中的NEWOLD元組。

為此,我會使用PL / PerlPL / 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM