feat: enterprise audit fixes (schema resolution, race conditions, documentation)
This commit is contained in:
@@ -19,10 +19,10 @@ BEGIN
|
||||
SELECT n.nspname INTO v_schema
|
||||
FROM pg_class c
|
||||
JOIN pg_namespace n ON n.oid = c.relnamespace
|
||||
WHERE c.relname = v_table;
|
||||
WHERE c.relname = v_table AND pg_table_is_visible(c.oid);
|
||||
|
||||
|
||||
IF EXISTS (SELECT 1 FROM pg_class WHERE relname = v_table AND relkind = 'r') THEN
|
||||
IF EXISTS (SELECT 1 FROM pg_class WHERE relname = v_table AND relkind = 'r' AND pg_table_is_visible(oid)) THEN
|
||||
RAISE NOTICE 'Converting table % to partitioned table...', v_table;
|
||||
|
||||
-- 1. Rename existing table
|
||||
@@ -48,19 +48,37 @@ BEGIN
|
||||
-- Optional: Migrate existing data
|
||||
-- EXECUTE format('INSERT INTO %I.%I SELECT * FROM %I.%I', v_schema, v_table, v_schema, v_old_table);
|
||||
|
||||
ELSIF EXISTS (SELECT 1 FROM pg_class WHERE relname = v_table AND relkind = 'p') THEN
|
||||
ELSIF EXISTS (SELECT 1 FROM pg_class WHERE relname = v_table AND relkind = 'p' AND pg_table_is_visible(oid)) THEN
|
||||
RAISE NOTICE 'Table % is already partitioned. Skipping conversion.', v_table;
|
||||
-- Just run maintenance to ensure partitions exist
|
||||
CALL partitions.run_maintenance();
|
||||
-- Just run maintenance for this specific table to ensure partitions exist
|
||||
CALL partitions.maintain_table(v_table, v_row.period, v_row.keep_history, v_row.future_partitions);
|
||||
ELSE
|
||||
RAISE WARNING 'Table % not found!', v_table;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
-- Attach trigger to housekeeper table to silently discard tasks for partitioned tables.
|
||||
-- Dynamically determine the schema of the housekeeper table to support custom schemas.
|
||||
SELECT n.nspname INTO v_schema
|
||||
FROM pg_class c
|
||||
JOIN pg_namespace n ON n.oid = c.relnamespace
|
||||
WHERE c.relname = 'housekeeper' AND pg_table_is_visible(c.oid);
|
||||
|
||||
IF v_schema IS NOT NULL THEN
|
||||
EXECUTE format('DROP TRIGGER IF EXISTS housekeeper_filter ON %I.housekeeper', v_schema);
|
||||
EXECUTE format('CREATE TRIGGER housekeeper_filter BEFORE INSERT ON %I.housekeeper FOR EACH ROW EXECUTE FUNCTION partitions.housekeeper_insert_trigger()', v_schema);
|
||||
RAISE NOTICE 'Housekeeper intercept trigger installed on %.housekeeper', v_schema;
|
||||
ELSE
|
||||
RAISE WARNING 'housekeeper table not found — trigger NOT installed!';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- Attach trigger to housekeeper table to silently discard tasks for partitioned tables
|
||||
DROP TRIGGER IF EXISTS housekeeper_filter ON housekeeper;
|
||||
CREATE TRIGGER housekeeper_filter
|
||||
BEFORE INSERT ON housekeeper
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION partitions.housekeeper_insert_trigger();
|
||||
-- ==========================================================================
|
||||
-- IMPORTANT: If the Zabbix Server connects with a non-superuser (e.g., 'zabbix'),
|
||||
-- that user MUST have access to the partitions schema for the housekeeper trigger
|
||||
-- to work. Without these GRANTs, every INSERT into housekeeper will FAIL.
|
||||
-- Uncomment and adjust the username below:
|
||||
-- ==========================================================================
|
||||
-- GRANT USAGE ON SCHEMA partitions TO zabbix;
|
||||
-- GRANT SELECT ON partitions.config TO zabbix;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user