在PostgreSQL触发之前忽略结果?
这个线程是其中的一个部分挑战,我正在寻找一个更好的解决方案。 我只想启动一个触发器,将其转换为正确的括号。 我正在考虑是否应该从触发器NULL返回,或者在触发器之前返回其他内容 代码 我通过函数使用它在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
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;