批量操作PostgreSQL数据库对象权限

发表时间: 2021-09-29 11:38

技术导语: 批操才是王道(请容许我为了节省文字,这么简称“批量操作”),为什么?因为效率。数据库的操作历来是繁琐枯燥的,尤其pg库的网上相关资料相对甚少的情况下,很多极简操作是不容易被发现的,因此本文主要为了解决pg库批操问题。

pg库对象介绍

**数据库(database):**一般以业务类型划分,为保证业务不互相影响,而将不同业务数据分库存储,当然相关业务也可以同库分模式存储。
**模式(schema):**pg库实现跨库关联查询还是比较麻烦的,现了解到的应该是创建视图的方式,无疑增加了复杂度和维护成本,因此涉及到部分数据共享的业务建议同库分模式存储。
**表(table):**实际存储数据的逻辑对象,实际存储介质还是硬盘,以文件的形式存储。
**序列(sequence):**一般是递增序列,可设置初始值、最大值、递增值。
**索引(index):**为了实现快捷条件查询。

数据库变更所属用户

单记录操作

alter database db1 owner to to_user;

批操

select ‘alter database ‘||datname||’ owner to to_user;’ from pg_database;
获得如下结果,一次性复制执行即可:

模式变更所属用户

单记录操作

alter schema sche1 authorization to_user;

批操

select ‘alter schema ‘||nspname||’ authorization to_user;’ from pg_namespace;–此处注意,该方法仅支持一次操作一个库下的所有模式
获得如下结果,一次性复制执行即可:

表变更所属用户

单记录操作

alter table tb1 owner to to_user;

批操

select ‘alter table ‘|| nsp.nspname||’.’||cls.relname||’ owner to to_user;’ from pg_class cls left join pg_namespace nsp on cls.relnamespace=nsp.oid where nsp.nspname in(‘public’)
and cls.relkind=‘r’
order by nsp.nspname,cls.relname; --此处可以指定某个模式下的表,也可以不指定模式,即为指定库下的所有表
获得如下结果,一次性复制执行即可:

序列变更所属用户

单记录操作

alter sequence seq1 owner to to_user;

批操

select ‘alter sequence ‘|| nsp.nspname||’.’||cls.relname||’ owner to to_user;’ from pg_class cls left join pg_namespace nsp on cls.relnamespace=nsp.oid where nsp.nspname in(‘public’)
and cls.relkind=‘S’
order by nsp.nspname,cls.relname; --此处可以指定某个模式下的序列,也可以不指定模式,即为指定库下的所有序列
获得如下结果,一次性复制执行即可:

索引变更所属用户

单记录操作

alter index idx1 owner to to_user;

批操

select ‘alter index ‘|| nsp.nspname||’.’||cls.relname||’ owner to df_sys;’ from pg_class cls left join pg_namespace nsp on cls.relnamespace=nsp.oid where nsp.nspname in(‘public’)
and cls.relkind=‘i’
order by nsp.nspname,cls.relname; --此处可以指定某个模式下的索引,也可以不指定模式,即为指定库下的所有索引
获得如下结果,一次性复制执行即可:


如果您喜欢我的文章,请关注我。后续会提供更多的干货分享。