【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 系统表并生成修改语句。

相关推荐
Mr. Cao code16 小时前
MySQL数据卷实战:持久化存储秘籍
数据库·mysql·docker·容器
小北方城市网16 小时前
微服务架构设计实战指南:从拆分到落地,构建高可用分布式系统
java·运维·数据库·分布式·python·微服务
爱喝水的鱼丶16 小时前
SAP-ABAP:SAP性能侦探:STAD事务码的深度解析与应用实战
开发语言·数据库·学习·sap·abap
五阿哥永琪16 小时前
MySQL相关的面试题 MySQL存储引擎与索引机制深度解析
数据库·mysql
Full Stack Developme17 小时前
达梦(DM8)基于 LBS(位置服务)教程
服务器·网络·数据库
小湘西17 小时前
数仓分层架构详解2:ODS、DWD、DWS
大数据·数据库·数据仓库
「、皓子~17 小时前
AI创作系列35 海狸IM桌面版:本地数据库的设计艺术
数据库·golang·毕业设计·开源软件·im·社交软件
谷哥的小弟17 小时前
SQLite MCP服务器安装以及客户端连接配置
服务器·数据库·人工智能·sqlite·大模型·源码·mcp
1.14(java)17 小时前
掌握数据库约束:确保数据精准可靠
java·数据库·mysql·数据库约束