CREATE SCHEMA
功能描述
创建Schema。
Schema又称作模式,从逻辑上组织一个数据库中的对象和数据。通过管理Schema,允许多个用户使用同一数据库而不相互干扰,同时便于将第三方应用添加到相应的Schema下而不引起冲突。
Schema的核心作用是:
- 逻辑隔离:实现数据、功能、租户的隔离。
- 权限控制:提供细粒度的安全边界。
- 组织管理:使数据库结构清晰可维护。
- 命名空间:避免对象命名冲突。
相同的数据库对象名称可以应用在同一数据库的不同Schema中,而没有冲突。例如,a_schema和b_schema都可以包含名为mytable的表。具有所需权限的用户可以访问数据库的多个Schema中的对象。
在当前数据库中创建用户时,系统会在当前数据库中为新用户创建一个同名Schema,例如创建用户user1,默认会创建一个名称为user1的Schema。
注意事项
- 只要用户对当前数据库有CREATE权限,就可以创建模式。
- 系统管理员在普通用户同名Schema下创建的对象,所有者为Schema的同名用户(非系统管理员)。
- 访问命名对象时可以使用模式名作为前缀进行访问,如果无模式名前缀,则访问当前模式下的命名对象。创建命名对象时也可用模式名作为前缀修饰。
- CREATE SCHEMA可以包括在新模式中创建对象的子命令,这些子命令和那些在创建完模式后发出的命令没有任何区别。如果使用了AUTHORIZATION子句,则所有创建的对象都将被该用户所拥有。
语法格式
- 根据指定的名字创建模式:
1 2 3 4
CREATE SCHEMA schema_name [ AUTHORIZATION user_name ] [ WITH PERM SPACE 'space_limit'] [ schema_element [ ... ] ]; CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION user_name ] [ WITH PERM SPACE 'space_limit'] ;
- 根据用户名创建模式:
1 2
CREATE SCHEMA AUTHORIZATION user_name [ WITH PERM SPACE 'space_limit'] [ schema_element [ ... ] ]; CREATE SCHEMA IF NOT EXISTS AUTHORIZATION user_name [ WITH PERM SPACE 'space_limit'] ;
参数说明
|
参数 |
描述 |
取值范围 |
|---|---|---|
|
schema_name |
模式名称。
须知:
|
字符串,需符合标识符的命名规范,参见标识符命名规范。 |
|
AUTHORIZATION user_name |
指定模式的所有者。当不指定schema_name时,把user_name当作模式名,此时user_name只能是角色名。 |
已存在的用户名/角色名。 |
|
WITH PERM SPACE 'space_limit' |
指定模式的永久表存储空间上限。当不指定space_limit时,则不限制。 |
字符串格式为正整数+单位,单位当前支持K/M/G/T/P。解析后的数值以K为单位,且范围不能够超过64比特表示的有符号整数,即1KB~9007199254740991KB。 示例请参见示例:创建一个设置了永久存储空间的Schema。 |
|
schema_element |
在模式里创建对象的SQL语句。目前仅支持CREATE TABLE、CREATE VIEW、CREATE INDEX、CREATE PARTITION、GRANT子句。 子命令所创建的对象都被AUTHORIZATION子句指定的用户所拥有。 |
- |
|
IF NOT EXISTS |
指定IF NOT EXISTS时,若不存在同名SCHEMA,则可以成功创建SCHEMA。若已存在同名SCHEMA,创建时不会报错,仅会提示该SCHEMA已存在,且不执行任何操作。当使用该参数时,不能包括Schema_element子命令。 IF NOT EXISTS参数仅9.1.0及以上版本支持。 如果当前搜索路径上的模式中存在同名对象时,需要明确指定引用对象所在的模式。可以通过命令SHOW SEARCH_PATH来查看当前搜索路径上的模式。 |
- |
示例:基础用例
创建一个角色role1。
1
|
CREATE ROLE role1 IDENTIFIED BY '{password}'; |
为用户role1创建一个同名schema,子命令创建的表films和winners的拥有者为role1。
1 2 3 4 |
CREATE SCHEMA AUTHORIZATION role1 CREATE TABLE films (title text, release date, awards text[]) CREATE VIEW winners AS SELECT title, release FROM films WHERE awards IS NOT NULL; |
示例:创建一个设置了永久存储空间的Schema
以下模拟一个示例,创建一个名为testsche的schema,并设置永久存储空间为10MB,当数据超过该设置值,系统报错。
除了通过SQL语句设置永久存储空间之外,您也可以通过控制台界面进行Schema永久存储空间设置,详情参见配置DWS数据库的Schema存储空间章节。
- 创建一个名为testsche的schema,并设置永久存储空间为10MB。
1CREATE SCHEMA testsche WITH PERM SPACE '10M';
- 使用系统表PG_NAMESPACE查询Schema的表存储间大小,其中permspace为永久存储空间限额,usedspace为已使用永久存储空间大小。
1SELECT permspace,usedspace FROM PG_NAMESPACE WHERE nspname = 'testsche';

- 创建一张测试表,并导入数据。
1 2 3
CREATE TABLE testsche.src AS SELECT 1; CREATE TABLE testsche.t1(a int, b numeric(15,2)) WITH(orientation=column); INSERT INTO testsche.t1 SELECT generate_series(1,20000000) % 1000,generate_series(1,20000000) FROM testsche.src;
回显报错信息,超过该schema的永久存储空间大小。

- 调大Schema的永久存储空间大小为10GB,再次导入,显示成功。
1 2
ALTER SCHEMA testsche WITH PERM SPACE '10G'; INSERT INTO testsche.t1 SELECT generate_series(1,20000000) % 1000,generate_series(1,20000000) FROM testsche.src;

- 查看已用空间。
1SELECT permspace,usedspace FROM PG_NAMESPACE WHERE nspname = 'testsche';
