Fix false-positive stale view warnings
Rules/mappings changes don't affect view SQL (views read from transformed, shaped by config.fields) — remove those triggers. Replace with a BEFORE UPDATE trigger on sources that only clears view_generated_at when config actually changes. Stack sources trigger now skips no-op upserts: the live SQL preview calls upsertStackSource on every edit, which was unconditionally clearing view_generated_at even when nothing changed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
e5b95e7112
commit
f373c85c16
@ -10,45 +10,46 @@ ALTER TABLE dataflow.sources ADD COLUMN IF NOT EXISTS view_generated_at TIMESTAM
|
|||||||
ALTER TABLE dataflow.stacks ADD COLUMN IF NOT EXISTS view_generated_at TIMESTAMPTZ;
|
ALTER TABLE dataflow.stacks ADD COLUMN IF NOT EXISTS view_generated_at TIMESTAMPTZ;
|
||||||
|
|
||||||
------------------------------------------------------
|
------------------------------------------------------
|
||||||
-- Trigger: clear source view_generated_at when rules change
|
-- Trigger: clear source view_generated_at when config (field definitions) changes
|
||||||
|
-- Rules and mappings affect transformed data, not view structure — no trigger needed there
|
||||||
------------------------------------------------------
|
------------------------------------------------------
|
||||||
CREATE OR REPLACE FUNCTION dataflow.rules_changed()
|
|
||||||
RETURNS TRIGGER AS $$
|
|
||||||
BEGIN
|
|
||||||
UPDATE dataflow.sources SET view_generated_at = NULL
|
|
||||||
WHERE name = COALESCE(NEW.source_name, OLD.source_name);
|
|
||||||
RETURN NULL;
|
|
||||||
END;
|
|
||||||
$$ LANGUAGE plpgsql;
|
|
||||||
|
|
||||||
DROP TRIGGER IF EXISTS trg_rules_changed ON dataflow.rules;
|
DROP TRIGGER IF EXISTS trg_rules_changed ON dataflow.rules;
|
||||||
CREATE TRIGGER trg_rules_changed
|
DROP TRIGGER IF EXISTS trg_mappings_changed ON dataflow.mappings;
|
||||||
AFTER INSERT OR UPDATE OR DELETE ON dataflow.rules
|
DROP FUNCTION IF EXISTS dataflow.rules_changed();
|
||||||
FOR EACH ROW EXECUTE FUNCTION dataflow.rules_changed();
|
DROP FUNCTION IF EXISTS dataflow.mappings_changed();
|
||||||
|
|
||||||
------------------------------------------------------
|
CREATE OR REPLACE FUNCTION dataflow.source_config_changed()
|
||||||
-- Trigger: clear source view_generated_at when mappings change
|
|
||||||
------------------------------------------------------
|
|
||||||
CREATE OR REPLACE FUNCTION dataflow.mappings_changed()
|
|
||||||
RETURNS TRIGGER AS $$
|
RETURNS TRIGGER AS $$
|
||||||
BEGIN
|
BEGIN
|
||||||
UPDATE dataflow.sources SET view_generated_at = NULL
|
IF NEW.config IS DISTINCT FROM OLD.config THEN
|
||||||
WHERE name = COALESCE(NEW.source_name, OLD.source_name);
|
NEW.view_generated_at := NULL;
|
||||||
RETURN NULL;
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
$$ LANGUAGE plpgsql;
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
DROP TRIGGER IF EXISTS trg_mappings_changed ON dataflow.mappings;
|
DROP TRIGGER IF EXISTS trg_source_config_changed ON dataflow.sources;
|
||||||
CREATE TRIGGER trg_mappings_changed
|
CREATE TRIGGER trg_source_config_changed
|
||||||
AFTER INSERT OR UPDATE OR DELETE ON dataflow.mappings
|
BEFORE UPDATE ON dataflow.sources
|
||||||
FOR EACH ROW EXECUTE FUNCTION dataflow.mappings_changed();
|
FOR EACH ROW EXECUTE FUNCTION dataflow.source_config_changed();
|
||||||
|
|
||||||
------------------------------------------------------
|
------------------------------------------------------
|
||||||
-- Trigger: clear stack view_generated_at when sources change
|
-- Trigger: clear stack view_generated_at when sources change
|
||||||
|
-- On UPDATE, skip if all view-relevant columns are unchanged (upsert no-ops should not mark stale)
|
||||||
------------------------------------------------------
|
------------------------------------------------------
|
||||||
CREATE OR REPLACE FUNCTION dataflow.stack_sources_changed()
|
CREATE OR REPLACE FUNCTION dataflow.stack_sources_changed()
|
||||||
RETURNS TRIGGER AS $$
|
RETURNS TRIGGER AS $$
|
||||||
BEGIN
|
BEGIN
|
||||||
|
IF TG_OP = 'UPDATE' THEN
|
||||||
|
IF NEW.field_map IS NOT DISTINCT FROM OLD.field_map AND
|
||||||
|
NEW.amount_sign IS NOT DISTINCT FROM OLD.amount_sign AND
|
||||||
|
NEW.balance_offset IS NOT DISTINCT FROM OLD.balance_offset AND
|
||||||
|
NEW.amount_field IS NOT DISTINCT FROM OLD.amount_field AND
|
||||||
|
NEW.date_field IS NOT DISTINCT FROM OLD.date_field AND
|
||||||
|
NEW.seq IS NOT DISTINCT FROM OLD.seq THEN
|
||||||
|
RETURN NULL;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
UPDATE dataflow.stacks SET view_generated_at = NULL
|
UPDATE dataflow.stacks SET view_generated_at = NULL
|
||||||
WHERE name = COALESCE(NEW.stack_name, OLD.stack_name);
|
WHERE name = COALESCE(NEW.stack_name, OLD.stack_name);
|
||||||
RETURN NULL;
|
RETURN NULL;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user