我旁边有关系(我只保留了相关领域):为什么引用的数据在引用时仍然不可用?
CREATE TABLE "operations" (
"id" serial NOT NULL,
"opdate" timestamp DEFAULT current_timestamp NOT NULL,
);
CREATE TABLE "prows" (
"id" serial NOT NULL,
"operation_id" integer NOT NULL,
);
ALTER TABLE "prows" ADD CONSTRAINT "prows_fk_operation_id" FOREIGN KEY ("operation_id")
REFERENCES "operations" ("id") ON DELETE CASCADE ON UPDATE RESTRICT;
CREATE TRIGGER "prow_bd_changesaldo" before delete
ON "prows" FOR EACH row EXECUTE PROCEDURE make_prow()
;
CREATE FUNCTION "make_prow"()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
DECLARE _count INT;
BEGIN
SELECT count(*) /* OP.OpDate */
FROM Operations OP
WHERE OP.ID = OLD.Operation_ID
INTO _count;
RAISE NOTICE 'COUNT: %', _count;
...
IF TG_OP = 'DELETE' THEN RETURN OLD; ELSE RETURN NULL; END IF;/**/
END;/**/
$$
我得到了count
为零:当引用的行不见了
delete from operations ;
NOTICE: COUNT: 0
CONTEXT: PL/pgSQL function make_prow() line 1 at RAISE
SQL statement "DELETE FROM ONLY "public"."prows" WHERE $1 OPERATOR(pg_catalog.=) "operation_id""
...
因此相关的行仍然存在。这对我来说似乎非常不一致,并破坏了诚信。
有没有办法从make_prow
触发得到Operations.OpDate
的值?
该标准[指定更严厉的排序](https://www.postgresql.org/docs/current/static/sql-createtrigger.html#SQL-CREATETRIGGER-COMPATIBILITY):* SQL指定“BEFORE DELETE在层叠的DELETE完成后级联删除触发器触发**。 PostgreSQL的行为是针对'BEFORE DELETE',在删除操作之前始终触发,甚至是级联操作。* - 但是在这两种情况下,当级联的DELETE触发时(和' BEFORE DELETE'在PostgreSQL中级联的'DELETE'触发之前触发)。 – pozs
所以总之:没有这样的方式。你需要在'operations'上创建一个'BEFORE DELETE'触发器。 – pozs
'CASCADE'删除仍然是一个delat,但目前的行为似乎cascade delation被实现为'AFTER DELETE'触发器。但我希望'CASCADE'的删除应该以最低优先级的'BEFORE DELETE'触发器来实现 –