ALTER SCHEMA
通过以下方式之一更改一个或多个架构:
-
通过在架构中创建的表启用或禁用架构权限的继承。
-
将架构所有权重新分配给另一个用户。
-
更改架构磁盘配额。
-
重命名一个或多个架构。
语法
ALTER SCHEMA [database.]schema
DEFAULT {INCLUDE | EXCLUDE} SCHEMA PRIVILEGES
| OWNER TO user-name [CASCADE]
| DISK_QUOTA { value | SET NULL }
您可以在单个操作中重命名多个架构:
ALTER SCHEMA [database.]schema[,...] RENAME TO new-schema-name[,...]
参数
- 数据库
- 包含架构的数据库的名称。如果指定,则必须是当前数据库。
- 架构
- 要修改的架构的名称。
DEFAULT {INCLUDE | EXCLUDE} SCHEMA PRIVILEGES
指定是否启用或禁用指定架构中新表的默认权限继承:
-
EXCLUDE SCHEMA PRIVILEGES
(默认值):禁用架构的权限继承。 -
INCLUDE SCHEMA PRIVILEGES
:指定为指定架构中的表授予的权限与为架构授予的权限相同。此选项对架构中的现有表没有影响。
另请参阅 启用架构继承。
-
OWNER TO
- 将架构所有权重新分配给指定用户:
OWNER TO user-name [CASCADE]
默认情况下,重新分配的架构中对象的所有权保持不变。要将架构对象的所有权重新分配给新架构所有者,请使用 CASCADE 对 OWNER TO 子句进行限定。有关详细信息,请参阅下面的级联架构所有权。
DISK_QUOTA
- 以下几项之一:
-
一个字符串,整数后跟支持的单位:K、M、G 或 T。如果新值小于当前使用量,操作将成功,但在使用量降至新配额以下之前,将无法使用更多磁盘空间。
-
SET NULL,用于移除配额。
有关详细信息,请参阅磁盘配额。
-
RENAME TO
- 重命名一个或多个架构:
RENAME TO new-schema-name[,...]
需要满足以下要求:
-
新架构名称符合标识符中描述的约定。此外,该名称在数据库中所有序列、表、投影、视图、模型和架构的名称中必须是唯一的。
-
如果指定多个要重命名的架构,则源列表和目标列表必须具有相同数量的名称。
当心
重命名视图引用的架构将导致视图失败,除非创建另一个架构来替换它。 -
特权
以下几项之一:
-
超级用户
-
架构所有者
级联架构所有权
默认情况下,ALTER SCHEMA...OWNER TO 不会影响目标架构中对象的所有权或授予给这些对象的权限。如果使用 CASCADE 对 OWNER TO 子句进行限定,Vertica 将对目标架构中的对象执行以下操作:
-
将先前架构所有者所拥有的对象所有权转移给新的所有者。
-
撤销上一个架构所有者授予的所有对象权限。
如果由非超级用户发出,ALTER SCHEMA...OWNER TO CASCADE 会忽略属于其他用户的所有对象,并就其无法更改的对象返回通知。例如:
-
架构
ms
归用户mayday
所有,其包含两个表:ms.t1
归 mayday 所有,ms.t2
归用户joe
所有:=> \dt List of tables Schema | Name | Kind | Owner | Comment ----------------+-----------------------+-------+---------+--------- ms | t1 | table | mayday | ms | t2 | table | joe |
-
用户
mayday
使用 CASCADE 将架构ms
的所有权转移给用户dbadmin
。返回时,ALTER SCHEMA 报告它无法转移归用户joe
所有的表ms.t2
及其投影的所有权:=> \c - mayday You are now connected as user "mayday". => ALTER SCHEMA ms OWNER TO dbadmin CASCADE; NOTICE 3583: Insufficient privileges on ms.t2 NOTICE 3583: Insufficient privileges on ms.t2_b0 NOTICE 3583: Insufficient privileges on ms.t2_b1 ALTER SCHEMA => \c You are now connected as user "dbadmin". => \dt List of tables Schema | Name | Kind | Owner | Comment ----------------+-----------------------+-------+---------+--------- ms | t1 | table | dbadmin | ms | t2 | table | joe |
-
用户
dbadmin
再次使用 CASCADE 将架构ms
的所有权转移给用户pat
。这次,因为dbadmin
是超级用户,所以 ALTER SCHEMA 可以将所有ms
表的所有权转移给用户pat
=> ALTER SCHEMA ms OWNER TO pat CASCADE; ALTER SCHEMA => \dt List of tables Schema | Name | Kind | Owner | Comment ----------------+-----------------------+-------+---------+--------- ms | t1 | table | pat | ms | t2 | table | pat |
交换架构
重命名架构可用于交换架构而无需实际移动数据。为便于交换,请输入一个不存在的、临时占位符架构。例如,以下 ALTER SCHEMA
语句使用临时架构 temps 来帮助架构 S1 与架构 S2 进行交换。在此示例中,S1 被重命名为 temps。然后 S2 被重命名为 S1。最后,temps 被重命名为 S2。
=> ALTER SCHEMA S1, S2, temps RENAME TO temps, S1, S2;
示例
以下示例将架构 S1
和 S2
分别重命名为 S3
和 S4
:
=> ALTER SCHEMA S1, S2 RENAME TO S3, S4;
此示例将新表 t2
的默认行为设置为自动继承架构的权限:
=> ALTER SCHEMA s1 DEFAULT INCLUDE SCHEMA PRIVILEGES;
=> CREATE TABLE s1.t2 (i, int);
此示例将新表的默认行为设置为不自动继承架构的权限:
=> ALTER SCHEMA s1 DEFAULT EXCLUDE SCHEMA PRIVILEGES;