Я пытаюсь настроить триггеры для событий вставки и обновления для главной таблицы некоторых таблиц разделов в PostgreSQL. Каждый раз, когда вставка выполняется в основную таблицу, триггерное событие вставки перенаправляет ее в правильную таблицу разделов. Следовательно, мне нужно будет вернуть NULL из этого вызова функции, так как я не хочу, чтобы основная таблица также заполнялась. Если главная таблица получает событие обновления, она обновляет метку времени перед внесением изменений в таблицу. Проблема в том, что триггер обновления никогда не срабатывает. Я использую PostgreSQL версии 9.6.
Я попытался объединить триггерные функции в одну, а также объединил вызванные триггерные процедуры в одну, но результаты такие же. Триггер обновления срабатывает только в том случае, если я возвращаю NEW из функции триггера вставки (которая заполняет главную таблицу) или если я вообще закомментирую функцию триггера вставки.
DROP SCHEMA IF EXISTS test CASCADE;
CREATE SCHEMA test;
SET SCHEMA 'test';
CREATE TYPE test_type AS ENUM ('unit', 'performance');
CREATE TABLE test (
type test_type NOT NULL,
score INTEGER NOT NULL CHECK (score > 0),
id SERIAL PRIMARY KEY,
updated_at TIMESTAMP DEFAULT current_timestamp
);
CREATE TABLE performance_test (
CHECK (type = 'performance')
) INHERITS (test);
CREATE FUNCTION insert_test()
RETURNS trigger AS
$$
BEGIN
INSERT INTO performance_test VALUES (NEW.*);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION update_timestamp()
RETURNS trigger AS
$$
BEGIN
RAISE NOTICE 'This is never reached.';
UPDATE performance_test
SET updated_at = current_timestamp
WHERE id = NEW.id;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER test_insertion BEFORE INSERT ON test
FOR EACH ROW EXECUTE PROCEDURE insert_test();
CREATE TRIGGER test_update BEFORE UPDATE ON test
FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
---------------------------------------------------------------------------
INSERT INTO test VALUES ('performance', 10);
SELECT * FROM performance_test;
UPDATE test SET score = 20 WHERE id = 1;
SELECT * FROM performance_test;
Я не уверен, что с помощью этого метода можно добиться того, чего я хочу, поэтому я обращаюсь сюда за любым советом. Заранее спасибо!
/ Хампус