mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-16 02:23:49 +08:00
132 lines
5.7 KiB
SQL
132 lines
5.7 KiB
SQL
-- Recreate _timescaledb_catalog.chunk table --
|
|
CREATE TABLE _timescaledb_internal.chunk_tmp
|
|
AS SELECT * from _timescaledb_catalog.chunk;
|
|
|
|
CREATE TABLE _timescaledb_internal.tmp_chunk_seq_value AS
|
|
SELECT last_value, is_called FROM _timescaledb_catalog.chunk_id_seq;
|
|
|
|
--drop foreign keys on chunk table
|
|
ALTER TABLE _timescaledb_catalog.chunk_constraint DROP CONSTRAINT
|
|
chunk_constraint_chunk_id_fkey;
|
|
ALTER TABLE _timescaledb_catalog.chunk_index DROP CONSTRAINT
|
|
chunk_index_chunk_id_fkey;
|
|
ALTER TABLE _timescaledb_catalog.chunk_data_node DROP CONSTRAINT
|
|
chunk_data_node_chunk_id_fkey;
|
|
ALTER TABLE _timescaledb_internal.bgw_policy_chunk_stats DROP CONSTRAINT
|
|
bgw_policy_chunk_stats_chunk_id_fkey;
|
|
ALTER TABLE _timescaledb_catalog.compression_chunk_size DROP CONSTRAINT
|
|
compression_chunk_size_chunk_id_fkey;
|
|
ALTER TABLE _timescaledb_catalog.compression_chunk_size DROP CONSTRAINT
|
|
compression_chunk_size_compressed_chunk_id_fkey;
|
|
|
|
--drop dependent views
|
|
DROP VIEW IF EXISTS timescaledb_information.hypertables;
|
|
DROP VIEW IF EXISTS timescaledb_information.chunks;
|
|
DROP VIEW IF EXISTS _timescaledb_internal.hypertable_chunk_local_size;
|
|
DROP VIEW IF EXISTS _timescaledb_internal.compressed_chunk_stats;
|
|
|
|
ALTER EXTENSION timescaledb DROP TABLE _timescaledb_catalog.chunk;
|
|
ALTER EXTENSION timescaledb DROP SEQUENCE _timescaledb_catalog.chunk_id_seq;
|
|
DROP TABLE _timescaledb_catalog.chunk;
|
|
|
|
CREATE SEQUENCE _timescaledb_catalog.chunk_id_seq MINVALUE 1;
|
|
|
|
-- now create table without self referential foreign key
|
|
CREATE TABLE _timescaledb_catalog.chunk (
|
|
id integer PRIMARY KEY DEFAULT nextval('_timescaledb_catalog.chunk_id_seq'),
|
|
hypertable_id int NOT NULL REFERENCES _timescaledb_catalog.hypertable (id),
|
|
schema_name name NOT NULL,
|
|
table_name name NOT NULL,
|
|
compressed_chunk_id integer ,
|
|
dropped boolean NOT NULL DEFAULT FALSE,
|
|
status integer NOT NULL DEFAULT 0,
|
|
UNIQUE (schema_name, table_name)
|
|
);
|
|
|
|
INSERT INTO _timescaledb_catalog.chunk
|
|
( id, hypertable_id, schema_name, table_name,
|
|
compressed_chunk_id, dropped, status)
|
|
SELECT id, hypertable_id, schema_name, table_name,
|
|
compressed_chunk_id, dropped, (
|
|
CASE
|
|
WHEN compressed_chunk_id IS NULL THEN 0
|
|
ELSE 1
|
|
END
|
|
)
|
|
FROM _timescaledb_internal.chunk_tmp;
|
|
|
|
--add indexes to the chunk table
|
|
CREATE INDEX chunk_hypertable_id_idx ON _timescaledb_catalog.chunk (hypertable_id);
|
|
CREATE INDEX chunk_compressed_chunk_id_idx ON _timescaledb_catalog.chunk (compressed_chunk_id);
|
|
|
|
ALTER SEQUENCE _timescaledb_catalog.chunk_id_seq OWNED BY _timescaledb_catalog.chunk.id;
|
|
SELECT setval('_timescaledb_catalog.chunk_id_seq', last_value, is_called) FROM _timescaledb_internal.tmp_chunk_seq_value;
|
|
|
|
-- add self referential foreign key
|
|
ALTER TABLE _timescaledb_catalog.chunk ADD CONSTRAINT chunk_compressed_chunk_id_fkey FOREIGN KEY ( compressed_chunk_id )
|
|
REFERENCES _timescaledb_catalog.chunk( id );
|
|
SELECT pg_catalog.pg_extension_config_dump('_timescaledb_catalog.chunk', '');
|
|
SELECT pg_catalog.pg_extension_config_dump('_timescaledb_catalog.chunk_id_seq', '');
|
|
|
|
--add the foreign key constraints
|
|
ALTER TABLE _timescaledb_catalog.chunk_constraint ADD CONSTRAINT
|
|
chunk_constraint_chunk_id_fkey FOREIGN KEY (chunk_id) REFERENCES _timescaledb_catalog.chunk(id);
|
|
ALTER TABLE _timescaledb_catalog.chunk_index ADD CONSTRAINT
|
|
chunk_index_chunk_id_fkey FOREIGN KEY (chunk_id)
|
|
REFERENCES _timescaledb_catalog.chunk(id) ON DELETE CASCADE;
|
|
ALTER TABLE _timescaledb_catalog.chunk_data_node ADD CONSTRAINT
|
|
chunk_data_node_chunk_id_fkey FOREIGN KEY (chunk_id) REFERENCES _timescaledb_catalog.chunk(id);
|
|
ALTER TABLE _timescaledb_internal.bgw_policy_chunk_stats ADD CONSTRAINT
|
|
bgw_policy_chunk_stats_chunk_id_fkey FOREIGN KEY (chunk_id)
|
|
REFERENCES _timescaledb_catalog.chunk(id) ON DELETE CASCADE;
|
|
ALTER TABLE _timescaledb_catalog.compression_chunk_size ADD CONSTRAINT
|
|
compression_chunk_size_chunk_id_fkey FOREIGN KEY (chunk_id)
|
|
REFERENCES _timescaledb_catalog.chunk(id) ON DELETE CASCADE;
|
|
ALTER TABLE _timescaledb_catalog.compression_chunk_size ADD CONSTRAINT
|
|
compression_chunk_size_compressed_chunk_id_fkey FOREIGN KEY (compressed_chunk_id)
|
|
REFERENCES _timescaledb_catalog.chunk(id) ON DELETE CASCADE;
|
|
|
|
--cleanup
|
|
DROP TABLE _timescaledb_internal.chunk_tmp;
|
|
DROP TABLE _timescaledb_internal.tmp_chunk_seq_value;
|
|
|
|
GRANT SELECT ON _timescaledb_catalog.chunk_id_seq TO PUBLIC;
|
|
GRANT SELECT ON _timescaledb_catalog.chunk TO PUBLIC;
|
|
|
|
-- end recreate _timescaledb_catalog.chunk table --
|
|
|
|
-- First we update the permissions of the compressed hypertables to
|
|
-- match the associated hypertable.
|
|
WITH
|
|
hypertables AS (
|
|
SELECT format('%I.%I', ht.schema_name, ht.table_name)::regclass AS hypertable_oid,
|
|
format('%I.%I', ct.schema_name, ct.table_name)::regclass AS compressed_hypertable_oid
|
|
FROM _timescaledb_catalog.hypertable ht
|
|
JOIN _timescaledb_catalog.hypertable ct ON ht.compressed_hypertable_id = ct.id
|
|
)
|
|
UPDATE pg_class
|
|
SET relacl = (SELECT relacl FROM pg_class WHERE oid = hypertable_oid)
|
|
FROM hypertables
|
|
WHERE oid = compressed_hypertable_oid;
|
|
|
|
-- Now we update the permissions of chunks of both compressed and
|
|
-- uncompressed hypertables to match the permissions of the associated
|
|
-- hypertable.
|
|
WITH
|
|
chunks AS (
|
|
SELECT format('%I.%I', ht.schema_name, ht.table_name)::regclass AS hypertable_oid,
|
|
format('%I.%I', ch.schema_name, ch.table_name)::regclass AS chunk_oid
|
|
FROM _timescaledb_catalog.hypertable ht
|
|
JOIN _timescaledb_catalog.chunk ch ON ht.id = ch.hypertable_id
|
|
WHERE NOT ch.dropped
|
|
)
|
|
UPDATE pg_class
|
|
SET relacl = (SELECT relacl FROM pg_class WHERE oid = hypertable_oid)
|
|
FROM chunks
|
|
WHERE oid = chunk_oid;
|
|
|
|
DROP FUNCTION IF EXISTS _timescaledb_internal.chunk_dml_blocker CASCADE;
|
|
|
|
-- drop the view as view definition changed
|
|
DROP VIEW IF EXISTS _timescaledb_internal.hypertable_chunk_local_size;
|