因为这个标识会同步在DB中建同名表,一旦修改,需要使用复合函数进行多项处理,以下是PG的处理函数能凑合用,还有待完善
CREATE OR REPLACE FUNCTION gf_alter_table_name (old_name text, new_name text)
RETURNS void
LANGUAGE plpgsql
AS $func$
DECLARE
ops record;
usc record;
jbop jsonb;
BEGIN
IF NOT EXISTS (SELECT key FROM collections WHERE name = old_name) THEN
RAISE NOTICE '% not exists, skip', old_name;
RETURN;
END IF;
UPDATE collections SET name = new_name WHERE name = old_name;
UPDATE collections SET options = regexp_replace(options::text,'"'||old_name||'"','"'||new_name||'"')::json WHERE options::text ~ old_name;
UPDATE collection_category SET collection_name = new_name WHERE collection_name = old_name;
UPDATE fields SET collection_name = new_name WHERE collection_name = old_name;
FOR ops IN
SELECT * FROM fields WHERE options::text ~ old_name
LOOP
UPDATE fields SET options = regexp_replace(ops.options::text,'"'||old_name||'"','"'||new_name||'"')::json WHERE key = ops.key;
END LOOP;
FOR usc IN SELECT "x-uid", schema FROM isahl_meta.ui_schemas WHERE schema::text ~ old_name
LOOP
UPDATE
ui_schemas
SET
schema = regexp_replace(usc.schema::text,'"'||old_name||'"','"'||new_name||'"')::json
WHERE
"x-uid" = usc."x-uid";
END LOOP;
EXECUTE format('ALTER INDEX IF EXISTS %I RENAME TO %I', old_name || '_pkey', new_name || '_pkey');
EXECUTE format('ALTER TABLE IF EXISTS %I RENAME TO %I', old_name, new_name);
END;
$func$;
1 Like