我想INSERT用 PostgreSQL 規則替換到一個表中。
這是我的兩個表:
Resource:
uid (PK): UUID
type (NOT_NULL): ENUM
SpecificResource:
uid (PK, FK on resource.uid): UUID
content (NOT_NULL): JSONB
我希望資料庫的任何用戶都能夠SpecificResource直接插入/更新/洗掉,而無需在資源上插入/更新/洗掉。
這是我觸發無限遞回回圈的不成功嘗試(實際上是因為我嘗試使用以下內容重新插入specific_resource表RULE (...) DO INSTEAD:
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)
);
uj5u.com熱心網友回復:
create or replace function specific_resource_tf()
returns trigger language plpgsql as
$$
begin
insert into resource(uid, type) VALUES (new.uid, 'SPECIFIC_RESOURCE');
return new;
end;
$$;
create trigger specific_resource_t
before insert on specific_resource
for each row
execute procedure specific_resource_tf();
解釋
創建觸發器后specific_resource_t,它將在每次插入 table 之前執行specific_resource。觸發器呼叫函式specific_resource_tf,該函式執行您的規則的意圖 -resource在繼續插入表之前插入記錄specific_resource。
插圖(帶有臨時表和函式)
-- drop table if exists specific_resource; drop table if exists resource;
create temp table resource (uid integer primary key, type text);
create temp table specific_resource (uid integer references resource(uid), content JSONB);
create or replace function pg_temp.specific_resource_tf()
returns trigger language plpgsql as $$
begin
insert into resource(uid, type) VALUES (new.uid, 'SPECIFIC_RESOURCE');
return new;
end;
$$;
create trigger specific_resource_t
before insert on specific_resource
for each row execute procedure pg_temp.specific_resource_tf();
insert into specific_resource values (22, '"test"');
-- does insert in both tables
uj5u.com熱心網友回復:
CREATE OR REPLACE FUNCTION add_specific_plus_resource()
RETURNS TRIGGER LANGUAGE PLPGSQL AS
$$
BEGIN
INSERT INTO resource(uid, type)
VALUES (uid, 'SPECIFIC');
RETURN NEW;
END;
$$;
CREATE OR REPLACE TRIGGER add_specific_resource
BEFORE INSERT ON specific_resource
FOR EACH ROW EXECUTE PROCEDURE add_specific_plus_resource();
以下INSERT適用于將一行添加到resource但不添加到specific_resource.
INSERT INTO specific_resource(uid, content)
VALUES ('123e4567-e89b-12d3-a456-426614174000', '"test"');
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/355697.html
標籤:sql 数据库 PostgreSQL
