【KingbaseES】批量修改数据库模式、表等对象的 Owner

批量修改 KingbaseES V8R6 数据库模式、表等对象的 Owner

在 KingbaseES V8R6 中批量修改数据库对象的 owner,可以通过以下方法实现:

使用 ALTER 语句批量修改

KingbaseES 支持使用 ALTER 语句修改对象的 owner。可以通过查询系统表获取对象列表,然后生成批量修改的 SQL 脚本。

sql 复制代码
-- 修改数据库owner
ALTER DATABASE databasename TO NEW_OWNER;

-- 批量修改所有表的 owner
SELECT 'ALTER TABLE ' || schemaname || '.' || tablename || ' OWNER TO NEW_OWNER;'
FROM pg_tables
WHERE schemaname NOT LIKE 'pg_%' AND schemaname != 'information_schema';

-- 批量修改所有序列的 owner
SELECT 'ALTER SEQUENCE ' || sequence_schema || '.' || sequence_name || ' OWNER TO NEW_OWNER;'
FROM information_schema.sequences
WHERE sequence_schema NOT LIKE 'pg_%' AND sequence_schema != 'information_schema';

-- 批量修改所有视图的 owner
SELECT 'ALTER VIEW ' || table_schema || '.' || table_name || ' OWNER TO NEW_OWNER;'
FROM information_schema.views
WHERE table_schema NOT LIKE 'pg_%' AND table_schema != 'information_schema';

批量修改模式的 owner

sql 复制代码
-- 查询所有模式并生成修改语句
SELECT 'ALTER SCHEMA ' || nspname || ' OWNER TO NEW_OWNER;'
FROM pg_namespace
WHERE nspname NOT LIKE 'pg_%' AND nspname != 'information_schema';

批量修改

对象类型 系统表查询条件
表 (Table) sys_class 中筛选 relkind = 'r'(普通表)和指定非系统模式
索引 (Index) sys_class 中筛选 relkind = 'i'(索引)和指定非系统模式
序列 (Sequence) sys_class 中筛选 relkind = 'S'(序列)和指定非系统模式
视图 (View) sys_class 中筛选 relkind = 'v'(视图)和指定非系统模式
sql 复制代码
DO $$
DECLARE
    sql_text TEXT;
    owner varchar := 'NEW_OWNER';
BEGIN
    SELECT string_agg('ALTER TABLE ' || n.nspname || '.' || c.relname || ' OWNER TO ' || owner || ';', ' ')
    INTO sql_text
    FROM sys_catalog.sys_class c
    LEFT JOIN sys_catalog.sys_namespace n ON n.oid = c.relnamespace
    WHERE c.relkind = 'r'
      AND c.relkind = 'i'
      AND c.relkind = 'S'
      AND c.relkind = 'v'
      AND n.nspname = 'PUBLIC'
      AND n.nspname NOT LIKE 'pg_%'
      AND n.nspname NOT LIKE '%_catalog'  
      AND n.nspname != 'information_schema';

    IF sql_text IS NOT NULL THEN
        EXECUTE sql_text;
    END IF;
END 
$$;

批量修改函数、存储过程的修改方法

sql 复制代码
DO $$
DECLARE
    sql_text TEXT;
    owner VARCHAR := 'NEW_OWNER'; -- 请替换为目标所有者用户名
    r RECORD;
BEGIN
    FOR r IN (
        -- 查询指定模式下的所有函数和存储过程
        SELECT p.proname as object_name, 
               CASE p.prokind 
                   WHEN 'f' THEN 'FUNCTION' 
                   WHEN 'p' THEN 'PROCEDURE' 
               END as object_type,
               n.nspname as schema_name,
               -- 获取参数列表以唯一标识重载函数
               sys_get_function_arguments(p.oid) as argument_list
        FROM sys_proc p
        JOIN sys_namespace n ON p.pronamespace = n.oid
        WHERE n.nspname = 'public' -- 指定模式名
          AND p.prokind IN ('f', 'p') -- 'f'为函数, 'p'为存储过程
          -- 排除系统对象
          AND n.nspname NOT LIKE 'pg_%' 
          AND n.nspname NOT LIKE '%_catalog'  
          AND n.nspname != 'information_schema'
    ) 
    LOOP
        -- 动态生成ALTER语句,注意使用`quote_ident`安全地处理标识符
        sql_text := 'ALTER ' || r.object_type || ' ' || 
                   quote_ident(r.schema_name) || '.' || 
                   quote_ident(r.object_name) || 
                   '(' || r.argument_list || ') OWNER TO ' || quote_ident(owner);
        
        -- 执行生成的SQL
        EXECUTE sql_text;
        -- 可选:打印出执行的语句以供检查
        -- RAISE NOTICE 'Executed: %', sql_text;
    END LOOP;
END 
$$;

注意事项

执行批量修改前,建议先备份数据库。修改 owner 需要足够的权限,通常需要超级用户或数据库管理员权限。

对于函数、存储过程等对象,可以使用类似的方法查询 pg_proc 系统表并生成修改语句。

相关推荐
SelectDB2 小时前
压缩率提升 48%,详解 Apache Doris 存储压缩优化之道|Deep Dive
数据库·开源·github
椰羊~王小美3 小时前
存储过程 vs 存储函数:全面对比
数据库
张人玉3 小时前
SQLite的数据格式和使用命令
数据库·oracle·sqlite
last demo3 小时前
MariaDB 数据库管理
linux·运维·服务器·数据库·php·mariadb
蒋士峰DBA修行之路3 小时前
实验二十六 GaussDB参数调优
数据库·oracle·gaussdb
q***3753 小时前
MySQL输入密码后闪退?
数据库·mysql·adb
张人玉3 小时前
SQLite 快速入门 Cheat Sheet
数据库·sql·sqlite
杨DaB3 小时前
【MySQL】03 数据库的CRUD
数据库·mysql·adb
DarkAthena3 小时前
【DuckDB】活用marco以兼容GaussDB的SQL执行
数据库·sql·duckdb