All checks were successful
Deploy yourpart (blue-green) / deploy (push) Successful in 1m39s
271 lines
8.9 KiB
SQL
271 lines
8.9 KiB
SQL
-- Debug-Queries: Tod -> Erbwechsel -> Cleanup
|
|
-- Nutzung:
|
|
-- psql ... -f docs/DEBUG_DEATH_SUCCESSION_QUERIES.sql
|
|
-- Ersetze zuerst:
|
|
-- :character_id (verstorbener Charakter)
|
|
-- :user_id (falukant_user.id des Spielers)
|
|
-- :heir_id (optional; geplanter Erbe)
|
|
--
|
|
-- In psql z. B.:
|
|
-- \set character_id 123
|
|
-- \set user_id 45
|
|
-- \set heir_id 678
|
|
|
|
-- ============================================================
|
|
-- 0) Vorab: Existenz / Ausgangszustand prüfen
|
|
-- ============================================================
|
|
|
|
SELECT c.id, c.user_id, c.health, c.updated_at
|
|
FROM falukant_data.character c
|
|
WHERE c.id = :character_id;
|
|
|
|
SELECT fu.id, fu.user_id, fu.money, fu.certificate
|
|
FROM falukant_data.falukant_user fu
|
|
WHERE fu.id = :user_id;
|
|
|
|
-- Mögliche Erben (wie QUERY_GET_HEIR priorisiert)
|
|
SELECT child_character_id, is_heir, updated_at
|
|
FROM falukant_data.child_relation
|
|
WHERE father_character_id = :character_id
|
|
OR mother_character_id = :character_id
|
|
ORDER BY (is_heir IS TRUE) DESC, updated_at DESC
|
|
LIMIT 20;
|
|
|
|
-- Fallback-Erbe (entspricht QUERY_RANDOM_HEIR-Prinzip: nur Vorschau)
|
|
SELECT cr.child_character_id
|
|
FROM falukant_data.child_relation cr
|
|
JOIN falukant_data.character c ON c.id = cr.child_character_id
|
|
WHERE (cr.father_character_id = :character_id OR cr.mother_character_id = :character_id)
|
|
AND c.health > 0
|
|
ORDER BY RANDOM()
|
|
LIMIT 1;
|
|
|
|
-- ============================================================
|
|
-- 1) Queries, die der Daemon im Todespfad nutzt (Vorschau)
|
|
-- Reihenfolge entspricht Worker-Logik.
|
|
-- ============================================================
|
|
|
|
-- 1.1 get_falukant_user_id
|
|
SELECT user_id
|
|
FROM falukant_data.character
|
|
WHERE id = :character_id;
|
|
|
|
-- 1.2 get_heir (bevorzugt is_heir=true)
|
|
SELECT child_character_id
|
|
FROM falukant_data.child_relation
|
|
WHERE father_character_id = :character_id OR mother_character_id = :character_id
|
|
ORDER BY (is_heir IS TRUE) DESC, updated_at DESC
|
|
LIMIT 1;
|
|
|
|
-- 1.3 random_heir (wenn 1.2 leer)
|
|
SELECT cr.child_character_id
|
|
FROM falukant_data.child_relation cr
|
|
JOIN falukant_data.character c ON c.id = cr.child_character_id
|
|
WHERE (cr.father_character_id = :character_id OR cr.mother_character_id = :character_id)
|
|
AND c.health > 0
|
|
ORDER BY RANDOM()
|
|
LIMIT 1;
|
|
|
|
-- 1.4 set_character_user (nur wenn Erbe vorhanden)
|
|
-- UPDATE falukant_data.character
|
|
-- SET user_id = :user_id, updated_at = NOW()
|
|
-- WHERE id = :heir_id;
|
|
|
|
-- 1.5 Vermögensberechnung: Inputs
|
|
SELECT money FROM falukant_data.falukant_user WHERE id = :user_id;
|
|
|
|
SELECT COALESCE(SUM(h.cost), 0) AS sum
|
|
FROM falukant_data.user_house uh
|
|
JOIN falukant_type.house h ON uh.house_type_id = h.id
|
|
WHERE uh.user_id = :user_id;
|
|
|
|
SELECT COALESCE(SUM(b.base_cost), 0) AS sum
|
|
FROM falukant_data.branch br
|
|
JOIN falukant_type.branch b ON br.branch_type_id = b.id
|
|
WHERE br.falukant_user_id = :user_id;
|
|
|
|
SELECT COALESCE(SUM(i.quantity * p.sell_cost), 0) AS sum
|
|
FROM falukant_data.inventory i
|
|
JOIN falukant_type.product p ON i.product_id = p.id
|
|
JOIN falukant_data.stock s ON i.stock_id = s.id
|
|
JOIN falukant_data.branch br ON s.branch_id = br.id
|
|
WHERE br.falukant_user_id = :user_id;
|
|
|
|
SELECT COALESCE(SUM(remaining_amount), 0) AS sum
|
|
FROM falukant_data.credit
|
|
WHERE falukant_user_id = :user_id;
|
|
|
|
SELECT COUNT(DISTINCT cr.child_character_id) AS cnt
|
|
FROM falukant_data.child_relation cr
|
|
JOIN falukant_data.character parent
|
|
ON (parent.id = cr.father_character_id OR parent.id = cr.mother_character_id)
|
|
WHERE parent.user_id = :user_id;
|
|
|
|
-- 1.6 set_new_money (nur wenn du den errechneten Wert testen willst)
|
|
-- UPDATE falukant_data.falukant_user
|
|
-- SET money = '<NEW_MONEY_NUMERIC_STRING>', updated_at = NOW()
|
|
-- WHERE id = :user_id;
|
|
|
|
-- 1.7 delete_director
|
|
WITH deleted AS (
|
|
DELETE FROM falukant_data.director
|
|
WHERE director_character_id = :character_id
|
|
RETURNING employer_user_id
|
|
)
|
|
SELECT * FROM deleted;
|
|
|
|
-- 1.8 delete_relationship
|
|
WITH deleted AS (
|
|
DELETE FROM falukant_data.relationship
|
|
WHERE character1_id = :character_id OR character2_id = :character_id
|
|
RETURNING CASE WHEN character1_id = :character_id THEN character2_id ELSE character1_id END AS related_character_id
|
|
)
|
|
SELECT c.user_id AS related_user_id
|
|
FROM deleted d
|
|
JOIN falukant_data.character c ON c.id = d.related_character_id;
|
|
|
|
-- 1.9 delete_child_relation_by_parent
|
|
DELETE FROM falukant_data.child_relation
|
|
WHERE father_character_id = :character_id OR mother_character_id = :character_id;
|
|
|
|
-- 1.10 delete_child_relation (als Kind)
|
|
WITH deleted AS (
|
|
DELETE FROM falukant_data.child_relation
|
|
WHERE child_character_id = :character_id
|
|
RETURNING father_character_id, mother_character_id
|
|
)
|
|
SELECT cf.user_id AS father_user_id, cm.user_id AS mother_user_id
|
|
FROM deleted d
|
|
JOIN falukant_data.character cf ON cf.id = d.father_character_id
|
|
JOIN falukant_data.character cm ON cm.id = d.mother_character_id;
|
|
|
|
-- 1.11 zusätzliche Cleanup-Queries
|
|
DELETE FROM falukant_data.knowledge
|
|
WHERE character_id = :character_id;
|
|
|
|
DELETE FROM falukant_data.debtors_prism
|
|
WHERE character_id = :character_id;
|
|
|
|
WITH removed AS (
|
|
DELETE FROM falukant_data.political_office
|
|
WHERE character_id = :character_id
|
|
RETURNING character_id, office_type_id, region_id, created_at
|
|
),
|
|
archived_removed AS (
|
|
INSERT INTO falukant_log.political_office_history
|
|
(character_id, office_type_id, region_id, start_date, end_date)
|
|
SELECT character_id, office_type_id, region_id, created_at, NOW()
|
|
FROM removed
|
|
),
|
|
affected AS (
|
|
SELECT DISTINCT office_type_id, region_id
|
|
FROM removed
|
|
),
|
|
seats AS (
|
|
SELECT pot.id AS office_type_id, rt.id AS region_id, pot.seats_per_region AS seats_total
|
|
FROM falukant_type.political_office_type pot
|
|
JOIN falukant_type.region rt ON pot.region_type = rt.label_tr
|
|
JOIN affected a ON a.office_type_id = pot.id AND a.region_id = rt.id
|
|
),
|
|
ranked AS (
|
|
SELECT po.id, po.character_id, po.office_type_id, po.region_id, po.created_at, s.seats_total,
|
|
ROW_NUMBER() OVER (
|
|
PARTITION BY po.office_type_id, po.region_id
|
|
ORDER BY po.created_at DESC
|
|
) AS rn
|
|
FROM falukant_data.political_office po
|
|
JOIN seats s ON s.office_type_id = po.office_type_id AND s.region_id = po.region_id
|
|
),
|
|
to_delete AS (
|
|
SELECT id, character_id, office_type_id, region_id, created_at
|
|
FROM ranked
|
|
WHERE rn > seats_total
|
|
),
|
|
archived_trim AS (
|
|
INSERT INTO falukant_log.political_office_history
|
|
(character_id, office_type_id, region_id, start_date, end_date)
|
|
SELECT character_id, office_type_id, region_id, created_at, NOW()
|
|
FROM to_delete
|
|
)
|
|
DELETE FROM falukant_data.political_office
|
|
WHERE id IN (SELECT id FROM to_delete);
|
|
|
|
-- election_candidate ist nicht in allen Bestands-DBs vorhanden:
|
|
SELECT EXISTS (
|
|
SELECT 1
|
|
FROM information_schema.tables
|
|
WHERE table_schema = 'falukant_data'
|
|
AND table_name = 'election_candidate'
|
|
) AS election_candidate_table_ready;
|
|
|
|
-- Nur ausführen, wenn vorher TRUE:
|
|
-- DELETE FROM falukant_data.election_candidate
|
|
-- WHERE character_id = :character_id;
|
|
|
|
-- 1.12 final delete_character
|
|
DELETE FROM falukant_data.character
|
|
WHERE id = :character_id;
|
|
|
|
-- ============================================================
|
|
-- 2) Nachkontrolle (muss leer / 0 sein)
|
|
-- ============================================================
|
|
|
|
SELECT 1 AS character_still_exists
|
|
FROM falukant_data.character
|
|
WHERE id = :character_id;
|
|
|
|
SELECT COUNT(*) AS knowledge_left
|
|
FROM falukant_data.knowledge
|
|
WHERE character_id = :character_id;
|
|
|
|
SELECT COUNT(*) AS debtors_prism_left
|
|
FROM falukant_data.debtors_prism
|
|
WHERE character_id = :character_id;
|
|
|
|
SELECT COUNT(*) AS political_office_left
|
|
FROM falukant_data.political_office
|
|
WHERE character_id = :character_id;
|
|
|
|
SELECT COUNT(*) AS election_candidate_left
|
|
FROM falukant_data.election_candidate
|
|
WHERE character_id = :character_id;
|
|
|
|
SELECT *
|
|
FROM falukant_log.political_office_history
|
|
WHERE character_id = :character_id
|
|
ORDER BY end_date DESC
|
|
LIMIT 10;
|
|
|
|
-- Neuer aktiver Charakter des Users:
|
|
SELECT c.id, c.user_id, c.health, c.updated_at
|
|
FROM falukant_data.character c
|
|
WHERE c.user_id = :user_id
|
|
ORDER BY c.updated_at DESC, c.id DESC
|
|
LIMIT 10;
|
|
|
|
-- ============================================================
|
|
-- 3) Unabhängig: completion_count-Fehler für Zertifikat
|
|
-- ============================================================
|
|
|
|
-- 3.1 Existiert Spalte?
|
|
SELECT column_name, data_type, is_nullable, column_default
|
|
FROM information_schema.columns
|
|
WHERE table_schema = 'falukant_log'
|
|
AND table_name = 'production'
|
|
AND column_name = 'completion_count';
|
|
|
|
-- 3.2 Sofort-Fix (idempotent), falls Spalte fehlt oder unvollständig:
|
|
ALTER TABLE falukant_log.production
|
|
ADD COLUMN IF NOT EXISTS completion_count integer;
|
|
|
|
UPDATE falukant_log.production
|
|
SET completion_count = 1
|
|
WHERE completion_count IS NULL;
|
|
|
|
ALTER TABLE falukant_log.production
|
|
ALTER COLUMN completion_count SET DEFAULT 1,
|
|
ALTER COLUMN completion_count SET NOT NULL;
|
|
|
|
-- 3.3 Optional: Migration historisch sauber markieren/prüfen
|
|
-- (abhängig davon, wie ihr Migrationsstände verwaltet)
|