这个帖子是这个帖子挑战的一部分,我正在寻找使用BEFORE TRIGGER更好的解决方案。 我只想启动一个触发器来转换为正确的括号。 我在考虑在before trigger中是否应该返回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 starts with 1 !
END LOOP;
-- do something with _result ...
RETURN NULL; -- result ignored since this is an BEFORE trigger TODO right?
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 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;
我对这一行不确定:
RETURN NULL; -- result ignored since this is an
BEFOREtrigger TODO right?
,因为我认为这是在AFTER
触发器中的情况,而不是在之前的触发器中。我只是想启动一个触发器来转换正确的括号。
测试命令是
sudo -u postgres psql detector -c "SELECT f_create_my_trigger_events(1,'[112]','[113]');"
,由于误解返回内容的原因,出现了以下错误。
LINE 3: CREATE TRIGGER insbef_ids
^
QUERY:
DROP TRIGGER IF EXISTS insbef_ids ON events
CREATE TRIGGER insbef_ids
BEFORE INSERT ON events
FOR EACH ROW EXECUTE PROCEDURE insbef_events_function('{112}')
CONTEXT: PL/pgSQL function f_create_my_trigger_events(integer,text,text) line 4 at EXECUTE statement
如何在PostgreSQL 9.4中管理BEFORE
触发器?