我有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') –