PostgreSQL模拟Oracle dba_objects查询出schema下所有的用户自定义对象

创建测试数据

psql -U postgres
create user test password 'test';
create database testdb;
\c testdb
CREATE SCHEMA AUTHORIZATION test;

创建对象

export PGPASSWORD=test
psql -U test -d testdb -- 创建域
create domain phone_type as text constraint phone_check check (VALUE ~ '^\d{11}$');
-- 创建数据类型
CREATE TYPE human_sex AS ENUM ('male', 'female');
CREATE TYPE test_type AS (f1 int, f2 text);
-- 创建序列
create sequence employees_s;
create sequence employees_s1;
-- 创建测试表
create table test_t1(id int);
create table test_t2(id int);
create table test_t3(id int);
create table test_t4(id int);
create table employees
( employee_id int8 primary key
, first_name varchar(20)
, last_name varchar(25)
, sex human_sex
, email varchar(25)
, phone_number phone_type
, salary numeric(8,2)
, last_update_date timestamp
, constraint emp_salary_min check (salary > 0)
, constraint emp_email_uk unique (email)
) ; create table tbp(id int,date timestamp(6),col2 text) partition by range(date);
create table tbp_2020 partition of tbp for values from ('2020-01-01') to ('2021-01-01');
create table tbp_2021 partition of tbp for values from ('2021-01-01') to ('2022-01-01');
create table tbp_2022 partition of tbp for values from ('2022-01-01') to ('2023-01-01');
create table tbp_2023 partition of tbp for values from ('2023-01-01') to ('2024-01-01');
create table tbp_default partition of tbp default; -- 创建主分区表
CREATE TABLE sales (
id int,
region VARCHAR(50),
sales_date DATE,
amount NUMERIC
) PARTITION BY RANGE (sales_date);
-- 创建一级分区
CREATE TABLE sales_2023 PARTITION OF sales FOR VALUES FROM ('2023-01-01') TO ('2024-01-01') PARTITION BY LIST (region);
CREATE TABLE sales_2024 PARTITION OF sales FOR VALUES FROM ('2024-01-01') TO ('2025-01-01') PARTITION BY LIST (region);
-- 创建二级分区
CREATE TABLE sales_2023_north PARTITION OF sales_2023 FOR VALUES IN ('North');
CREATE TABLE sales_2023_south PARTITION OF sales_2023 FOR VALUES IN ('South');
CREATE TABLE sales_2023_east PARTITION OF sales_2023 FOR VALUES IN ('East');
CREATE TABLE sales_2023_west PARTITION OF sales_2023 FOR VALUES IN ('West');
CREATE TABLE sales_2024_north PARTITION OF sales_2024 FOR VALUES IN ('North');
CREATE TABLE sales_2024_south PARTITION OF sales_2024 FOR VALUES IN ('South');
CREATE TABLE sales_2024_east PARTITION OF sales_2024 FOR VALUES IN ('East');
CREATE TABLE sales_2024_west PARTITION OF sales_2024 FOR VALUES IN ('West'); -- 插入数据
insert into employees values(nextval('employees_s'),'King','Johnn','male','johnn@163.com','15145264084',10000,now());
-- 以下两条应该报错
insert into employees values(nextval('employees_s'),'Job','Lucy','female','lucy@163.com','151452640841',10000,now());
insert into employees values(nextval('employees_s'),'Job','Lucy','females','lucy@163.com','15145264084',10000,now());
-- 创建索引
create index idx_name on employees(first_name,last_name);
create index idx_id on tbp(id);
create index idx_id2 on sales(id);
-- 创建约束
ALTER TABLE employees ADD CONSTRAINT check_salary CHECK (salary>0);

视图

-- 普通视图
create view emp as select * from employees;
-- 物化视图
create materialized view emp_v as select * from employees;
refresh materialized view emp_v;

创建触发器

-- 普通触发器
CREATE OR REPLACE FUNCTION update_time_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.last_update_date := CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql; CREATE TRIGGER update_time_trigger BEFORE UPDATE ON employees FOR EACH ROW EXECUTE FUNCTION update_time_column(); -- 事件触发器
CREATE OR REPLACE FUNCTION DISABLE_DROP_TABLE()
RETURNS event_trigger AS $$
BEGIN
if tg_tag = 'DROP TABLE' THEN
RAISE EXCEPTION 'Command % is disabled.', tg_tag;
END if;
END;
$$ LANGUAGE plpgsql; CREATE EVENT TRIGGER DISABLE_DROP_TABLE on ddl_command_start EXECUTE FUNCTION DISABLE_DROP_TABLE();

函数和存储过程

-- 函数
CREATE FUNCTION inc(val integer) RETURNS integer AS $$
BEGIN
RETURN val + 1;
END;
$$ LANGUAGE PLPGSQL; CREATE FUNCTION inc(val1 integer,val2 integer) RETURNS integer AS $$
BEGIN
RETURN val1 + val2;
END;
$$ LANGUAGE PLPGSQL; -- 存储过程
CREATE OR REPLACE PROCEDURE test_sum(a NUMERIC,b NUMERIC,C NUMERIC)
AS $$
DECLARE
val int;
BEGIN
val := a+b+c;
RAISE NOTICE 'Total is : % !',val;
END;
$$ language plpgsql;

对象信息查询

表(分区表和普通表)、索引(分区索引和普通索引)、视图、物化视图、序列

select relname as object_name,case when relkind='r' and relispartition='f' and relhassubclass='f' then '普通表'
when relkind='p' and relispartition='f' and relhassubclass='t' then '分区表主表'
when relkind='p' and relispartition='t' and relhassubclass='t' then '分区表一级分区'
when relkind='r' and relispartition='t' and relhassubclass='f' then '分区表子表'
when relkind='i' and relispartition='f' and relhassubclass='f' then '普通索引'
when relkind='I' and relispartition='f' and relhassubclass='t' then '分区表主表索引'
when relkind='i' and relispartition='t' and relhassubclass='f' then '分区表子表索引'
when relkind='I' and relispartition='t' and relhassubclass='t' then '分区表一级分区索引'
when relkind='S' then '序列'
when relkind='c' then '组合类型'
when relkind='m' then '物化视图'
when relkind='v' then '普通视图'
end as object_type
from pg_class
where relnamespace::REGNAMESPACE::text='test'
order by 2 nulls last;

数据类型

select typname as object_name,'数据类型' as object_type from pg_type t
left join pg_class c ON c.reltype = t.oid
where t.typnamespace::REGNAMESPACE::text='test'
AND c.relkind IS NULL
and t.typname !~ '^_';

约束

select conname as object_name,'约束' as object_type from pg_constraint where connamespace::REGNAMESPACE::text='test';

select t2.nspname as schema,t3.relname as table,t1.conname,
case when t1.contype='c' then '检查约束'
when t1.contype='p' then '主键约束'
when t1.contype='u' then '唯一约束' end as contype,
t4.relname as index
from pg_constraint t1 join pg_namespace t2 on t1.connamespace = t2.oid
join pg_class t3 on t1.conrelid = t3.oid
left join pg_class t4 on t1.conindid = t4.oid
where t2.nspname = 'test';

触发器

-- 普通触发器
select -- t3.nspname as schema,
concat(t2.relname,'.',tgname) as object_name,
'普通触发器' as object_type
from pg_trigger t1
join pg_class t2 on t1.tgrelid=t2.oid
join pg_namespace t3 on t2.relnamespace=t3.oid
where t3.nspname = 'test';
-- select concat(event_object_table,'.',trigger_name) as object_name,'trigger' as object_type from information_schema.triggers where trigger_schema='test'; -- 事件触发器
select evtname as object_name,'事件触发器' as object_type from pg_event_trigger;

存储过程/函数

select
translate(concat(proname,(select array(select format_type(val,null) from unnest(proargtypes) as val))::text),'{}','()') as object_name,
case when prokind='f' then '函数' when prokind='p' then '存储过程' end as object_type
from pg_proc
where pronamespace::REGNAMESPACE::text='test';

合并查询总数量

with schema_info as (
select unnest(ARRAY['test']) as schema_name -- 模式名
)
select object_type,count(*) from (
-- 表(分区表和普通表)、索引(分区索引和普通索引)、视图、物化视图、序列
select relname as object_name,
case when relkind='r' and relispartition='f' and relhassubclass='f' then '普通表'
when relkind='p' and relispartition='f' and relhassubclass='t' then '分区表主表'
-- when relkind='p' and relispartition='t' and relhassubclass='t' then '分区表一级分区'
-- when relkind='r' and relispartition='t' and relhassubclass='f' then '分区表子表'
when relkind='i' and relispartition='f' and relhassubclass='f' then '普通索引'
-- when relkind='I' and relispartition='f' and relhassubclass='t' then '分区表主表索引'
-- when relkind='i' and relispartition='t' and relhassubclass='f' then '分区表子表索引'
-- when relkind='I' and relispartition='t' and relhassubclass='t' then '分区表一级分区索引'
when relkind='S' then '序列'
when relkind='c' then '组合类型'
when relkind='m' then '物化视图'
when relkind='v' then '普通视图'
end as object_type
from pg_class join schema_info on (pg_class.relnamespace::REGNAMESPACE::text=schema_info.schema_name)
union all
-- 数据类型
select typname as object_name,'数据类型' as object_type from pg_type t
left join pg_class c ON c.reltype = t.oid
join schema_info on (t.typnamespace::REGNAMESPACE::text=schema_info.schema_name)
AND c.relkind IS NULL
and t.typname !~ '^_'
union all
-- 约束
select conname as object_name,'约束' as object_type from pg_constraint where connamespace::REGNAMESPACE::text=(select * from schema_info)
union all
-- 触发器
select -- t3.nspname as schema,
concat(t2.relname,'.',tgname) as object_name,
'普通触发器' as object_type
from pg_trigger t1
join pg_class t2 on t1.tgrelid=t2.oid
join pg_namespace t3 on t2.relnamespace=t3.oid
join schema_info on (t3.nspname=schema_info.schema_name)
union all
select evtname as object_name,'事件触发器' as object_type from pg_event_trigger
union all
-- 存储过程/函数
select
translate(concat(proname,(select array(select format_type(val,null) from unnest(proargtypes) as val))::text),'{}','()') as object_name,
case when prokind='f' then '函数' when prokind='p' then '存储过程' end as object_type
from pg_proc
join schema_info on (pg_proc.pronamespace::REGNAMESPACE::text=schema_info.schema_name)) t
where t.object_type is not null
group by 1
order by 2 desc;

PostgreSQL模拟Oracle dba_objects的更多相关文章

  1. [转帖]Oracle dba_objects和all_objects 最大的区别

    Oracle dba_objects和all_objects 最大的区别 原创 Oracle 作者:maohaiqing0304 时间:2015-08-14 15:07:18  9281  0   链 ...

  2. 如何在postgresql中模拟oracle的dual表,来测试数据库最基本的连接功能?

    还好,网上弄到的,,没有dual的数据库,可以试图用select函数不带from数据表的方式来实现返回值. 一段测试代码: try: conn = psycopg2.connect(database= ...

  3. PostgreSQL 与 Oracle 访问分区表执行计划差异

    熟悉Oracle 的DBA都知道,Oracle 访问分区表时,对于没有提供分区条件的,也就是在无法使用分区剪枝情况下,优化器会根据全局的统计信息制定执行计划,该执行计划针对所有分区适用.在分析利弊之前 ...

  4. (转)PostgreSQL 兼容Oracle - orafce

    转自:http://blog.163.com/digoal@126/blog/static/1638770402015112144250486/ PostgreSQL是和Oracle最接近的企业数据库 ...

  5. ORACLE DBA_OBJECTS视图中OBJECT_TYPE为LOB的对象查看

    在ORACLE数据库中,DBA_OBJECTS视图中OBJECT_TYPE为LOB的对象是什么东西呢?其实OBJECT_TYPE为LOB就是大对象(LOB),它指那些用来存储大量数据的数据库字段.下面 ...

  6. postgresql和oracle数据库对比

    SQL执行计划干预 从使用postgresql来看,想要改变执行计划只能通过対表进行分析,不能通过添加hint的方式来改变执行计划: oracle不仅可以通过对表进行收集统计来改变执行计划,而且很重要 ...

  7. postgresql与Oracle:空字符串与null

    空字符串:两个单引号,中间无空格等任何内容 在postgresql中,空字符串与null是不同的:而oracle中,空字符串与null等同.测试如下: postgresql中: postgres=# ...

  8. PostgreSQL与Oracle对应的函数

    一.对应的函数 1.sysdate oracle pgsql sysdate current_date. current_timestamp nvl coalesce  trunc date_trun ...

  9. mysql 模拟oracle中的序列

    因业务需要,把oracle 数据据转成mysql,同时oracle中程序本来一直在用 序列, mysql中没有,所以需要在mysql中新建一个表进行模拟, CREATE TABLE `sequence ...

  10. Windows的ODBC配置指南: MySQL, PostgreSQL, DB2, Oracle

    MySQL- 官网: https://dev.mysql.com/downloads/connector/odbc/- 安装: * msi格式, 直接安装即可 * zip格式, 解压缩, 命令行(管理 ...

随机推荐

  1. OpenHarmony编译构建系统详解,从零搭建windows下开发环境,巨方便!

    自从OpenHarmony更新了dev-tool,就可以在windows下构建鸿蒙(轻量型)系统了,这对于进行MCU开发的朋友们,学习鸿蒙OS会友好许多!我们可以更快的构建出系统,方便快速学习和验证. ...

  2. 23. 基于Cortex-A9 uboot代码启动分析

    本篇文章是彭老师第一次在B站直播间,边直播边记录笔记,视频已经上传到B站. 现在完善整理成该篇文章,有想学习uboot启动的代码详细流程的老铁可以进入我B站空间配合视频一起学习. [视频地址] B站用 ...

  3. 处理报错 ResizeObserver loop completed with undelivered notifications.

    // 处理报错 ResizeObserver loop completed with undelivered notifications. export const handlerResizeObse ...

  4. IE中在线预览PDF文件

    今天在项目中偶然遇到一个需要在线查看pdf的需求.在查阅一些资料之后使用了最简单的写法(需要在客户端安装AdbeRdr11000_zh_CN_11.0.0.379.exe软件). 还有其他方法可以实现 ...

  5. LaViT:这也行,微软提出直接用上一层的注意力权重生成当前层的注意力权重 | CVPR 2024

    Less-Attention Vision Transformer利用了在多头自注意力(MHSA)块中计算的依赖关系,通过重复使用先前MSA块的注意力来绕过注意力计算,还额外增加了一个简单的保持对角性 ...

  6. .NET 最好用的验证组件 FluentValidation

    前言 一个 .NET 验证框架,支持链式操作,易于理解,功能完善,组件内提供十几种常用验证器,可扩展性好,支持自定义验证器,支持本地化多语言. 项目介绍 FluentValidation 是一个开源的 ...

  7. 6.2 XXE和XML利用

    pikaqu靶场xml数据传输测试-有回显,玩法,协议,引入 1.构造payload 写文件 <?xml version="1.0" encoding="UTF-8 ...

  8. ASP.NET Core – Globalization & Localization

    前言 之前就写过 2 篇, 只是写的很乱, 这篇作为整理版. Asp.net core (学习笔记 路由和语言 route & language) Asp.net core 学习笔记之 glo ...

  9. Asp.net Core 学习笔记 Azure Storage

    更新: 2021-07-22 使用 Azure storage 以后, 还要解决一个 url 的问题. 文件自然是通过我们的 domain 来访问才合理丫. 这个是 azure 的 url : htt ...

  10. 使用 Wake Lock API:保持设备唤醒的最佳实践

    在现代 Web 应用中,尤其是涉及视频播放.实时通信.地图导航等长时间运行的任务时,用户常常希望设备不要因为空闲而自动进入睡眠模式或屏幕变暗.为了解决这一问题,Web API 提供了一个名为 Wake ...