【发布时间】:2015-07-25 20:47:31
【问题描述】:
我正计划使用instead of insert 触发器查看视图。不过插入默认值似乎有问题。
触发器设置如下,以下查询失败
INSERT INTO v1.clients (foo) VALUES ('bar')
这会返回一个
“is_admin”列中的空值违反非空约束
即使底层data.users (not null) 表设置了默认值。
我要说的是视图将所有缺失值转换为null,并应用instead of,试图将null 插入not null default false 列。
我可以以某种方式设置触发器而不是尝试插入 null 来插入默认值吗?在触发器的相关插入中包含coalesce(NEW.is_admin, default) 是语法错误。我宁愿不要在触发器中手动复制默认值。
postgres 支持吗? 将两个表的视图拆分为这些表的最佳方法是什么,同时允许使用默认值?
定义:
CREATE OR REPLACE VIEW v1.clients AS
SELECT
c.id, c.foo,
u.id user_id, u.is_admin
FROM data.clients c
INNER JOIN data.users u ON u.client_id = c.id;
CREATE FUNCTION data.separate_client_user_data()
RETURNS TRIGGER AS $$
DECLARE
client_id clients.id%TYPE;
BEGIN
INSERT INTO data.clients (foo) VALUES (NEW.foo) RETURNING id INTO client_id;
INSERT INTO data.users (client_id, is_admin)
VALUES (client_id, NEW.is_admin);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER user_data_trigger
INSTEAD OF INSERT ON v1.clients
FOR EACH ROW EXECUTE PROCEDURE data.separate_client_user_data();
【问题讨论】:
标签: postgresql triggers plpgsql