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