Использую PGSQL, нyужно написать тригерную функцию: при удалении записи из таблицы Document нужно обновить\удалить запись из DocumentRaw. Нужно обновить json из DocumentRaw, если поле NewKey пустое у записи, то запись нужно удалить.
Написал такой вариант, но тут 3 действия: select, update, delete хочется сделать в 2 действия, select + (update либо delete в зависимости от условия) может это сделать через CASE
IF (OLD."Pk_Id" IS NOT NULL)
THEN
WITH rec AS(
SELECT "@Document" AS "Id",
(COALESCE(("Key"->>OLD."Key"::text)::bigint, 0) - 1)::bigint AS "Value",
"Key" - OLD."Key"::text AS "NewKey"
FROM "Document"
WHERE "Pk_Id" = OLD."Pk_Id"
LIMIT 1
),
upd AS(
UPDATE "DocumentRaw"
SET "Key" = (CASE
WHEN (SELECT "Value" FROM rec) > 0 AND rec."NewKey" != '{}'::jsonb
THEN "Key" || jsonb_build_object(OLD."Key"::text, (SELECT "Value" FROM rec))
WHEN (SELECT "Value" FROM rec) <= 0 AND rec."NewKey" != '{}'::jsonb
THEN "Key" - OLD."Key"::text
END
)
FROM rec
WHERE
rec."NewKey" != '{}'::jsonb AND
"@DocumentRaw" = rec."Id"
)
DELETE FROM "DocumentRaw"
USING rec
WHERE rec."NewKey" = '{}'::jsonb AND
"@DocumentRaw" = rec."Id";
END IF;