Postgresql

Postgresql:如何將數組傳遞給 TG_ARGV 中的觸發函式?

  • April 8, 2021

我有一些相當通用的 Postgres 觸發器函式,我想在幾個不同的表中重複使用它們。為此,我將參數作為CREATE TRIGGER語句的一部分傳遞,因此它們將在 TG_ARGV 數組中可用,如文件中所述。

只要我的所有參數都是標量,這工作就很好,但是其中有幾個確實應該表示為數組。

這是我正在嘗試做的一個簡化範例:

CREATE OR REPLACE FUNCTION example_function() RETURNS TRIGGER AS
$$
DECLARE
   special_names text[];
   special_users text[];
BEGIN
 special_names := TG_ARGV[0];
 special_users := TG_ARGV[1];
 IF NEW.name = ANY(special_names) THEN
   NEW.name = 'special';
 END IF;
 IF NEW.user = ANY(special_users) THEN
   NEW.user = 'flag';
 END IF;
 RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER on_create_flag_special
BEFORE INSERT ON example_table
FOR EACH ROW
EXECUTE PROCEDURE example_function(
   ARRAY['magicname1', 'magicname2']::text[],
   ARRAY['user1', 'user2']::text[]
);

Postgres 抱怨

錯誤:“[”處或附近的語法錯誤

第 5 行:數組

$$ ‘magicname1’, ‘magicname2’ $$::文本$$ $$,

在其他情況下,這是數組文字的有效語法(例如SELECT ARRAY['magicname1', 'magicname2']::text[];可以正常工作)。我也嘗試過使用其他語法變體,例如'{"magicname1", "magicname2"}'::text[]但沒有任何成功。

誰能建議將數組參數傳遞給觸發函式的好方法?這是不可能的,我應該放棄並通過 JSON 字元串或其他東西進行編碼/解碼嗎?

string_to_array()在您的解決方案中僅當您想允許非標準數組語法時才有用。否則,直接投射會更簡單、更便宜。您可以在聲明時進行分配。像:

CREATE OR REPLACE FUNCTION example_function()
 RETURNS TRIGGER
 LANGUAGE plpgsql AS
$func$
DECLARE
   special_names text[] := TG_ARGV[0]::text[];
   special_users text[] := TG_ARGV[1]::text[];
BEGIN
  IF NEW.name = ANY(special_names) THEN
     NEW.name = 'special';
  END IF;
  IF NEW.user = ANY(special_users) THEN
     NEW.user = 'flag';
  END IF;
  RETURN NEW;
END
$func$;

按照 Jeff 的建議,在觸發器中使用正確的數組語法:

CREATE TRIGGER on_create_flag_special
BEFORE INSERT ON example_table
FOR EACH ROW                             
EXECUTE PROCEDURE example_function(
   '{magicname1,magicname2}',        
   '{user1,user2}'
);

{magicname1,magicname2}是 Postgres 中用於輸入和輸出的數組的標准文本表示。

引用自:https://dba.stackexchange.com/questions/289367