数据表标识,为啥不能修改?

因为这个标识会同步在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