Re: UPSERT on a view

Поиск
Список
Период
Сортировка
От Melvin Davidson
Тема Re: UPSERT on a view
Дата
Msg-id CANu8FiznoYDtLONXpBZjNa75JbAHWetwzUVGr6pfuJdjRG_ZOg@mail.gmail.com
обсуждение исходный текст
Ответ на UPSERT on a view  (Steven Roth <steve@rothskeller.net>)
Ответы Re: UPSERT on a view
Re: UPSERT on a view
Список pgsql-general


On Mon, Mar 12, 2018 at 2:26 PM, Steven Roth <steve@rothskeller.net> wrote:
Why does the following code raise an error?

CREATE TABLE ttest (x integer);
CREATE VIEW vtest AS SELECT x FROM ttest;
CREATE FUNCTION vtest_insert() RETURNS trigger LANGUAGE plpgsql AS $$
    RAISE 'foo' USING ERRCODE='unique_violation';
END $$;
CREATE TRIGGER vtest_insert INSTEAD OF INSERT ON vtest
    FOR EACH ROW EXECUTE PROCEDURE vtest_insert();
INSERT INTO vtest VALUES (1) ON CONFLICT DO NOTHING;

This code raises the error 'foo', even though the insert says DO NOTHING and the error type is unique_violation.  Why?

More generally:  how can one write trigger functions for a view (that is not automatically updatable), such that INSERT ... ON CONFLICT DO UPDATE will work with the correct semantics?  What can one do in the INSERT trigger that will cause PostgreSQL to execute the caller-supplied UPDATE clause?

Thanks,
Steve


>CREATE TRIGGER vtest_insert INSTEAD OF INSERT ON vtest
>    FOR EACH ROW EXECUTE PROCEDURE vtest_insert();
>INSERT INTO vtest VALUES (1) ON CONFLICT DO NOTHING;

Your problem is that
A. TRIGGERS are meant for TABLES, not views
and
B. You CANNOT insert into a VIEW.

https://www.postgresql.org/docs/9.6/static/sql-createtrigger.html

CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] } ON table_name [ FROM referenced_table_name ] [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ] [ FOR [ EACH ] { ROW | STATEMENT } ] [ WHEN ( condition ) ] EXECUTE PROCEDURE function_name ( arguments )

Please also note that it is very helpful if you specify PostgreSQL version and O/S when submitting to this list.


--
Melvin Davidson
Maj. Database & Exploration Specialist

Universe Exploration Command – UXC

Employment by invitation only!

В списке pgsql-general по дате отправления:

Предыдущее
От: Melvin Davidson
Дата:
Сообщение: Re: Programmatically duplicating a schema
Следующее
От: "David G. Johnston"
Дата:
Сообщение: Re: Programmatically duplicating a schema