У меня есть 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 ...
- person a_horse_with_no_name   schedule 20.10.2015on delete cascade
) - person a_horse_with_no_name   schedule 20.10.2015CREATE FUNCTION
, вызвавший ошибку. Никогда не просто запутанный фрагмент. Заголовок функции является неотъемлемой частью. - person Erwin Brandstetter   schedule 21.10.2015T_PRIVILEGE
(используя подзапрос), затем удалить изt_user_privileges
. Не связано, но: вам действительно следует держаться подальше от идентификаторов в кавычках. В долгосрочной перспективе они доставляют гораздо больше хлопот, чем того стоят. - person a_horse_with_no_name   schedule 21.10.2015userid is a parameter for the SP
, но в обновленном определении функции нет параметра (кстати, это функция, а не хранимая процедура — в Postgres нет фактических SP). - person Erwin Brandstetter   schedule 21.10.2015t_privilege
. Что делать, если есть привилегии, используемые другими пользователями, а не тем, которого вы пытаетесь удалить? Все, что вам нужно сделать, это:delete from t_user_privileges where user_id = ...; delete from t_user where id = ...;
, см.: sqlfiddle.com/#!15/51097/1 Также: почему вы добавляете префиксT_
к каждому имени таблицы? Вы также добавляете префиксC_
ко всем своим классам в вашем языке программирования? - person a_horse_with_no_name   schedule 21.10.2015