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

相关推荐
Elastic 中国社区官方博客7 小时前
将你自己的密钥用于现有 Elastic Cloud 部署
大数据·数据库·elasticsearch·全文检索
红海云7 小时前
Jev:给智能系统做判断的模型
大数据·数据库·人工智能
wjkjpcba7 小时前
PCBA烧录程序是什么:PCBA包工包料厂家解析烧录与测试
linux·数据库·人工智能·smt贴片加工·pcba贴片加工厂
꯭自꯭闭꯭8 小时前
达梦事物特性及MVCC
linux·运维·数据库
小马同学-8 小时前
MySQL主从复制和读写分离
数据库·mysql
谢亮_vipxieliang8 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
geovindu9 小时前
sql: JSON and XML Data Handling in SQL using sql server 2025
大数据·数据库·sqlserver·数据库开发·数据库架构
IT大白鼠9 小时前
图数据库系列 · 第 02 篇——架构拆解:原生图存储到因果集群
数据库·架构·nosql
EatFan10 小时前
从“框架混战“到“运行时收敛“:2026 年 AI Agent 开发框架的三条路线之争
java·数据库·人工智能·多智能体·ai agent·mcp·agent 框架
小蒜学长10 小时前
基于SpringBoot的佳新超市管理系统设计与实现系统(代码+数据库+LW)
java·数据库·spring boot·后端·佳新超市管理系统