【发布时间】:2021-12-23 03:20:23
【问题描述】:
我想用 PostgreSQL 规则将INSERT 替换成一个表。
这是我的两张桌子:
Resource:
uid (PK): UUID
type (NOT_NULL): ENUM
SpecificResource:
uid (PK, FK on resource.uid): UUID
content (NOT_NULL): JSONB
我希望数据库的任何用户都能够直接在SpecificResource 上进行插入/更新/删除,而无需在资源上插入/更新/删除。
这是触发无限递归循环的不成功尝试(实际上是因为我尝试使用RULE (...) DO INSTEAD 重新插入specific_resource 表:
CREATE OR REPLACE RULE insert_specific_resource
AS ON INSERT TO specific_resource
DO INSTEAD (
INSERT INTO resource (uid, type)
VALUES (NEW.uid, 'SPECIFIC_RESOURCE');
INSERT INTO specific_resource (uid)
VALUES (new.uid)
);
【问题讨论】:
-
你坚持使用规则吗?也许是
instead of触发器? -
触发器也很好,但它远远超出了我的 SQL 知识范围。
-
我会推荐一个给你。更容易理解。
-
@Stefanov.sm 以下触发器适用于
resource表。但是,它不会在INSERT INTO specific_resource ...CREATE OR REPLACE FUNCTION add_specific_resource() RETURNS TRIGGER AS $BODY$ BEGIN INSERT INTO resource(uid, type) VALUES (uid, 'SPECIFIC_RESOURCE'); RETURN NEW; END $BODY$ LANGUAGE PLPGSQL; CREATE OR REPLACE TRIGGER add_dashboard BEFORE INSERT ON dashboard FOR EACH ROW EXECUTE PROCEDURE add_specific_resource();CREATE OR REPLACE FUNCTION add_specific_resource() RETURNS TRIGGER AS $BODY$ BEGIN INSERT INTO resource(uid, type) VALUES (uid, 'SPECIFIC_RESOURCE'); RETURN NEW; END $BODY$ LANGUAGE PLPGSQL; CREATE OR REPLACE TRIGGER add_dashboard BEFORE INSERT ON dashboard FOR EACH ROW EXECUTE PROCEDURE add_specific_resource();specific_resource表中插入任何内容
标签: sql database postgresql