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

相关推荐
2601_949593653 小时前
深入解析CANN-acl应用层接口:构建高效的AI应用开发框架
数据库·人工智能
javachen__3 小时前
mysql新老项目版本选择
数据库·mysql
Dxy12393102163 小时前
MySQL如何高效查询表数据量:从基础到进阶的优化指南
数据库·mysql
Dying.Light3 小时前
MySQL相关问题
数据库·mysql
蜡笔小炘4 小时前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs
韩立学长4 小时前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
Re.不晚4 小时前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
老邓计算机毕设5 小时前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
麦聪聊数据5 小时前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构
2301_790300965 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python