我有3個表格 - T_USER
,T_PRIVILEGE
和T_USER_PRIVILEGES
。無法從臨時表中選擇
T_USER_PRIVILEGES
是參考表,其中保存從T_USER
行到T_PRIVILEGE
行的參考。我想從T_USER
刪除一行,爲此,我需要首先刪除T_USER_PRIVILEGES
中的引用,以及T_PRIVILEGE
中的所有引用行。
我想創建一個臨時表從T_PRIVILEGE
持有的所有引用的行,然後從T_USER_PRIVILEGES
刪除所有的引用,最後刪除所有來自T_PRIVILEGE
存儲在臨時表中的行。
我嘗試做的是創建一個完成它的存儲過程:
CREATE FUNCTION "SP_DELETE_USER"(userid character varying) RETURNS void AS
$BODY$CREATE TEMP TABLE temp_privilege_ids
(
privilege_id VARCHAR(100)
);
SELECT "PRIVILEGE_ID"
INTO temp_privilege_ids
FROM
(SELECT * FROM "T_USER_PRIVILEGES"
WHERE "USER_ID" = userid) as foo;
DELETE FROM "T_USER_PRIVILEGES"
WHERE "USER_ID" = userid;
DELETE FROM "T_PRIVILEGE"
WHERE "ID" IN
(SELECT privilege_id FROM temp_privilege_ids);$BODY$
LANGUAGE sql VOLATILE NOT LEAKPROOF;
ALTER FUNCTION public."SP_DELETE_USER"(character varying)
OWNER TO postgres;
userid
是SP的參數。
當我嘗試創建SP pgAdmin的說:
relation "temp_privilege_ids" does not exist LINE 19: (SELECT privilege_id FROM temp_privilege_ids);$BODY$
我也到處去尋找解釋,但沒有找到答案。 任何人有想法?
這是參考表:
CREATE TABLE "T_USER_PRIVILEGES" (
"USER_ID" character varying(100) NOT NULL,
"PRIVILEGE_ID" character varying(100) NOT NULL,
CONSTRAINT "PK_T_USER_PRIVILEGES" PRIMARY KEY ("USER_ID", "PRIVILEGE_ID"),
CONSTRAINT "FK_T_USER_PRIVILEGES_PRIVILEGES" FOREIGN KEY ("PRIVILEGE_ID")
REFERENCES "T_PRIVILEGE" ("ID") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT "FK_T_USER_PRIVILEGES_USER" FOREIGN KEY ("USER_ID")
REFERENCES "T_USER" ("ID") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
CREATE INDEX "FKI_T_USER_PRIVILEGES_PRIVILEGES"
ON "T_USER_PRIVILEGES" ("PRIVILEGE_ID" COLLATE pg_catalog."default");
無關,但:'select .. into temp_privilege_ids'應該是'insert into temp_privilege_ids select ...'。或者更好:只使用一個'create table ... as select ...' –
在_compile_ time期間檢查表的存在,並且在創建函數時,表確實不存在。編譯器不知道表在運行時會存在。 –
Plus:臨時表完全沒用。這可以用這兩個滑動delete語句來完成(或:創建兩個表之間的FK約束與'上刪除cascade') –