合 PG中的模式
参考:http://postgres.cn/docs/13/ddl-schemas.html
模式(schema):我们在pg数据库中创建的任何对象(表,索引,视图等)都会在一个模式下被创建。
当创建对象时,如果未指定模式,这些对象将会在默认的模式下被创建.这个模式叫做public。public模式,代表所有人的意思。
一个例外情况是另一个模式首先出现在search_path中.
一个PostgreSQL数据库集簇中包含一个或更多命名的数据库。 角色和一些其他对象类型被整个集簇共享,连接到服务器的客户端只能访问单个数据库中的数据,在连接请求中指定的那一个。
注意
一个集簇的用户并不必拥有访问集簇中每一个数据库的权限。 角色名的共享意味着不可能在同一个集簇中出现重名的不同角色,例如两个数据库中都有叫joe
的用户。 但系统可以被配置为只允许joe
访问某些数据库。
一个数据库包含一个或多个命名模式,模式中包含着表。模式还包含其他类型的命名对象,包括数据类型、函数和操作符。相同的对象名称可以被用于不同的模式中二不会出现冲突,例如schema1
和myschema
都可以包含名为mytable
的表。和数据库不同,模式并不是被严格地隔离:一个用户可以访问他们所连接的数据库中的所有模式内的对象,只要他们有足够的权限。
下面是一些使用方案的原因:
- 允许多个用户使用一个数据库并且不会互相干扰。
- 将数据库对象组织成逻辑组以便更容易管理。
- 第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。
模式类似于操作系统层的目录,但是模式不能嵌套。
创建模式
要创建一个模式,可使用CREATE SCHEMA命令,并且给出选择的模式名称。例如:
1 | CREATE SCHEMA myschema; |
在一个模式中创建或访问对象,需要使用由模式名和表名构成的限定名,模式名和表名之间以点号分隔:
1 | schema.table |
在任何需要一个表名的地方都可以这样用,包括表修改命令和后续章节要讨论的数据访问命令(为了简洁我们在这里只谈到表,但是这种方式对其他类型的命名对象同样有效,例如类型和函数)。
事实上,还有更加通用的语法:
1 | database.schema.table |
也可以使用,但是目前它只是在形式上与SQL标准兼容。如果我们写一个数据库名称,它必须是我们正在连接的数据库。
因此,如果要在一个新模式中创建一个表,可用:
1 2 3 | CREATE TABLE myschema.mytable ( ... ); |
要删除一个为空的模式(其中的所有对象已经被删除),可用:
1 | DROP SCHEMA myschema; |
要删除一个模式以及其中包含的所有对象,可用:
1 | DROP SCHEMA myschema CASCADE; |
有关于此的更一般的机制请参见第 5.14 节。
我们常常希望创建一个由其他人所拥有的模式(因为这是将用户动作限制在良定义的名字空间中的方法之一)。其语法是:
1 | CREATE SCHEMA schema_name AUTHORIZATION user_name; |
我们甚至可以省略模式名称,在此种情况下模式名称将会使用用户名,参见第 5.9.6 节。
以pg_
开头的模式名被保留用于系统目的,所以不能被用户所创建。
公共模式
在前面的小节中,我们创建的表都没有指定任何模式名称。默认情况下这些表(以及其他对象)会自动的被放入一个名为“public”的模式中
。任何新数据库都包含这样一个模式。因此,下面的命令是等效的:
1 | CREATE TABLE products ( ... ); |
以及:
1 | CREATE TABLE public.products ( ... ); |
示例:
1 2 3 4 5 6 7 8 9 10 | postgres=# create database db1; CREATE DATABASE postgres=# \c db1 You are now connected to database "db1" as user "postgres". db1=# \dn List of schemas Name | Owner --------+---------- public | postgres (1 row) |