postgresql中的schema

pg中的schema类似于mysql数据库的角色

实例-->database-->schema-->数据库对象,表,视图,存储过程,函数等

CREATE SCHEMA myschema;
访问的时候需要写成schema_name.table_name的形式,比如

select * from schema_name.table_name;
CREATE TABLE schema_name.table_name(...);
CREATE SCHEMA schema_name AUTHORIZATION user_name;创建一个名为schema_name的schema,他的owner是user_name

删除schema
DROP SCHEMA myschema;
删除schema以及其中的所有对象
DROP SCHEMA myschema CASCADE;
创建时也可以不写schema名称,不写的时候默认schema名称是用户名

数据库中会有默认的schema,名称为public
可以在其中建表

CREATE TABLE table_name;
或者
CREATE TABLE public.table_name;

搜索路径
每个数据库下面可能有多个schema,比如a数据库有b,c,d,e四个schema
那么访问的时候就需要写成select * from a.table_name;或者select * from b.table_name;等
SHOW search_path;//可以查看当前库下面的搜索路径
如果不想写成select * from a.table_name;或者select * from b.table_name;
则可以设置他的搜索路径
SET search_path TO a,public;
那么后续scheme a下的表进行访问的时候就可以直接使用select * from table_name进行查询

show search_path
search_path
--------------
 "$user", public  //表示有个与当前用户同名的schema,和public两个schema

如果其他用户想访问某个schema下的对象,则该schema的owner必须赋予其他用户的usage权限,如果需要做其他操作也需要赋予相应的权限在默认情况下,所有人都拥有在public模式上的CREATE和USAGE权限。

REVOKE CREATE ON SCHEMA public FROM PUBLIC;//第一个“public”是模式,第二个“public”指的是“每一个用户”。第一种是一个标识符,第二种是一个关键词,所以两者的大小写不同,即收回所有用户在public 这个schema下的create权限

查看当前数据库下的所有schema

SELECT * FROM information_schema.schemata;
mydb=> SELECT * FROM information_schema.schemata;
 catalog_name |    schema_name     | schema_owner | default_character_set_catalog | default_character_set_schema | default
_character_set_name | sql_path
--------------+--------------------+--------------+-------------------------------+------------------------------+--------
--------------------+----------
 mydb         | pg_catalog         | postgres     |                               |                              |
                    |
 mydb         | public             | postgres     |                               |                              |
                    |
 mydb         | information_schema | postgres     |                               |                              |
                    |
(3 rows)

mydb=> \c postgres
You are now connected to database "postgres" as user "b1".
postgres=> SELECT * FROM information_schema.schemata;
 catalog_name |    schema_name     | schema_owner | default_character_set_catalog | default_character_set_schema | default
_character_set_name | sql_path
--------------+--------------------+--------------+-------------------------------+------------------------------+--------
--------------------+----------
 postgres     | pg_catalog         | postgres     |                               |                              |
                    |
 postgres     | information_schema | postgres     |                               |                              |
                    |
 postgres     | public             | postgres     |                               |                              |
                    |
(3 rows)

系统目录模式

除了public模式之外,还有pg_catalog模式,其中包含了各种系统表以及系统默认的数据类型操作符等等,一般在search_path中没有显示的定义pg_catalog的时候,会优先在这个schema搜索,如果需要自定义一些和pg_catalog下的同名对象的时候,可以显式的将pg_catalog放在一般在search_path中没有显示的定义pg_catalog的时候的末尾

posted @ 2022-06-22 14:40  南大仙  阅读(5370)  评论(0编辑  收藏  举报