【发布时间】:2017-04-29 00:14:08
【问题描述】:
我正在尝试通过 PostgreSQL 视图上的 insert 或 update 调用更新表。这是我所做的一个简化示例:
[Person] table:
id | lastname | firstname | city | age
[Person_View] table:
id | lastname | firstname | city
这里是触发器和相关程序:
CREATE TRIGGER tg_update_person_view
INSTEAD OF INSERT OR UPDATE OR DELETE ON
Person_View FOR EACH ROW EXECUTE PROCEDURE update_person_view_table();
CREATE OR REPLACE FUNCTION update_person_view_table()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $function$
BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO Person (id, lastname, firstname)
VALUES(NEW.id, NEW.lastname, NEW.firstname);
RETURN NEW;
ELSIF TG_OP = 'UPDATE' THEN
UPDATE Person
SET id=NEW.id, lastname=NEW.lastname, firstname=NEW.firstname
WHERE id=OLD.id;
RETURN NEW;
END IF;
RETURN NEW;
END;
$function$;
如果我这样做:
INSERT INTO Person_View (id, city) VALUES ('3', 'Berlin')
将只有 ID 的行添加到视图和父表中。
如何在过程中检查插入值的列是否在过程中定义了“映射”,如果没有任何映射的列,它不会继续?
【问题讨论】:
-
在 Postgres 9.3+ 中你不需要规则也不需要触发器,基于单个表的视图是自动更新的。
-
我知道,我应该说这个简化的例子是自动更新的。我的真实情况是我有基于多个表的视图,我不希望出现这些空记录。
标签: sql postgresql stored-procedures views plpgsql