在PostgreSQL触发之前忽略结果?

在PostgreSQL触发之前忽略结果?,postgresql,triggers,plpgsql,dynamic-sql,Postgresql,Triggers,Plpgsql,Dynamic Sql,这个线程是其中的一个部分挑战,我正在寻找一个更好的解决方案。 我只想启动一个触发器,将其转换为正确的括号。 我正在考虑是否应该从触发器NULL返回,或者在触发器之前返回其他内容 代码 我通过函数使用它 CREATE OR REPLACE FUNCTION f_create_my_trigger_events(_arg1 int, _arg2 text, _arg3 text) RETURNS void AS $func$ BEGIN EXECUTE format($$ DROP T

这个线程是其中的一个部分挑战,我正在寻找一个更好的解决方案。 我只想启动一个触发器,将其转换为正确的括号。 我正在考虑是否应该从触发器NULL返回,或者在触发器之前返回其他内容

代码

我通过函数使用它

CREATE OR REPLACE FUNCTION f_create_my_trigger_events(_arg1 int, _arg2 text, _arg3 text)
  RETURNS void AS
$func$
BEGIN

EXECUTE format($$
    DROP TRIGGER IF EXISTS insbef_ids ON events
    CREATE TRIGGER insbef_ids
    BEFORE INSERT ON events
    FOR EACH ROW EXECUTE PROCEDURE insbef_events_function(%1$L)$$
    , translate(_arg2, '[]', '{}'), translate(_arg3, '[]', '{}')
);

END
$func$ LANGUAGE plpgsql;
我不确定这行:
returnnull;——忽略结果,因为这是一个
触发器之前的
TODO right?
,因为我认为在
触发器之后的
中是这种情况,而不是在触发器之前。
我只想启动一个触发器来转换正确的括号

测试命令是
sudo-u postgres psql detector-c“SELECT f_create_my_trigger_events(1、[112]、[113]);”
由于对返回事件的误解,我认为会出现以下错误


如何在PostgreSQL 9.4中管理触发器之前的

首先,需要在触发器之前的
中传递行变量。传递
NULL
将取消对行的操作:

CREATE OR REPLACE FUNCTION insbef_events_function() 
  RETURNS TRIGGER AS 
$func$
DECLARE
   m int[]; 
BEGIN
   FOREACH m SLICE 1 IN ARRAY TG_ARGV[0]::int[]
   LOOP
      INSERT INTO events (measurement_id, event_index_start, event_index_end) 
      SELECT NEW.measurement_id, m[1], m[2];  -- Postgres array subscripts start with 1
   END LOOP;

      -- do something with _result ...

   RETURN NEW;  -- NULL would cancel operation in BEFORE trigger!
END 
$func$ LANGUAGE plpgsql;
现在您的责任是两个数组具有相同数量的元素。
更改触发器的函数现在可能如下所示:

CREATE OR REPLACE FUNCTION f_create_my_trigger_events(_arg1 int, _arg2 text, _arg3 text)
  RETURNS void AS
$func$
BEGIN
   EXECUTE format(
    $$DROP TRIGGER IF EXISTS insbef_ids ON measurements; -- on measurements ..
      CREATE TRIGGER insbef_ids
      BEFORE INSERT ON measurements  -- .. according to previous posts!!
      FOR EACH ROW EXECUTE PROCEDURE insbef_events_function(%s, %L, %L)$$
    , _arg1
    , translate(_arg2, '[]', '{}')
    , translate(_arg3, '[]', '{}')
   );
END
$func$  LANGUAGE plpgsql;

在使用此高级自动化设计之前,您需要了解SQL、plpgsql和触发器函数的基础知识。

@ErwinBrandstetter是的,您的!我花了几天的时间在不同的环境中测试你的建议,它们都起作用了,但忘记接受你的答案。
CREATE OR REPLACE FUNCTION insbef_events_function() 
  RETURNS TRIGGER AS 
$func$
DECLARE
   m int[]; 
BEGIN
   FOREACH m SLICE 1 IN ARRAY TG_ARGV[0]::int[]
   LOOP
      INSERT INTO events (measurement_id, event_index_start, event_index_end) 
      SELECT NEW.measurement_id, m[1], m[2];  -- Postgres array subscripts start with 1
   END LOOP;

      -- do something with _result ...

   RETURN NEW;  -- NULL would cancel operation in BEFORE trigger!
END 
$func$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION insbef_events_function() 
  RETURNS TRIGGER AS 
$func$
DECLARE
   a1 int[] := TG_ARGV[1]::int[];
   a2 int[] := TG_ARGV[2]::int[];
BEGIN
   FOR i in array_lower(a1, 1) .. array_upper(a1, 1)
   LOOP
      INSERT INTO events (measurement_id, event_index_start, event_index_end) 
      SELECT NEW.measurement_id  -- or TG_ARGV[0]::int instead?
           , a1[i]
           , a2[i];
   END LOOP;

   RETURN NEW;  -- NULL would cancel operation in BEFORE trigger!
END 
$func$  LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION f_create_my_trigger_events(_arg1 int, _arg2 text, _arg3 text)
  RETURNS void AS
$func$
BEGIN
   EXECUTE format(
    $$DROP TRIGGER IF EXISTS insbef_ids ON measurements; -- on measurements ..
      CREATE TRIGGER insbef_ids
      BEFORE INSERT ON measurements  -- .. according to previous posts!!
      FOR EACH ROW EXECUTE PROCEDURE insbef_events_function(%s, %L, %L)$$
    , _arg1
    , translate(_arg2, '[]', '{}')
    , translate(_arg3, '[]', '{}')
   );
END
$func$  LANGUAGE plpgsql;