导出对象
Vertica 函数 EXPORT_OBJECTS 生成一个 SQL 脚本,您可以使用该脚本在另一个群集上重新创建非虚拟编录对象,如下所示:
EXPORT_OBJECTS( ['[destination]' [, '[scope]'] [, 'mark-ksafe']] )
SQL 脚本符合以下要求:
-
仅包括用户有权访问的对象。
-
根据对象依赖关系对 CREATE 语句进行排序,以便可以按正确的顺序重新创建它们。例如,如果表在非 PUBLIC 架构中,则所需的 CREATE SCHEMA 语句位于 CREATE TABLE 语句之前。同样,表的 CREATE ACCESS POLICY 语句跟在表的 CREATE TABLE 语句之后。
-
如果可能,使用其 KSAFE 子句(如果有)创建投影,否则使用其 OFFSET 子句。
设置导出范围
EXPORT_OBJECTS scope 实参指定导出操作的范围:
注意
EXPORT_OBJECTS 不导出授权。升级数据库时,保留对库的授权尤其重要:如果 UDx 库的原型发生更改,Vertica 会放弃对它们的授权。为了保留对 UDx 库的授权,请在升级前备份授权,然后在升级的数据库中还原授权。有关详细信息,请参阅备份和还原授权。导出所有对象
如果将范围参数设置为空字符串 (''
),Vertica 会按依赖关系顺序从源数据库中导出所有非虚拟对象。在另一个群集中运行生成的 SQL 脚本,可创建所有引用对象及其依赖对象。
默认情况下,函数的 KSAFE 实参设置为 true。在本例中,生成的脚本调用 MARK_DESIGN_KSAFE,它复制了原始数据库的 K-safety。
=> SELECT EXPORT_OBJECTS(
'/home/dbadmin/xtest/sql_objects_all.sql',
'',
'true');
EXPORT_OBJECTS
-------------------------------------
Catalog data exported successfully
(1 row)
SQL 脚本中包含以下类型的语句:
-
CREATE SCHEMA
-
CREATE TABLE
-
ALTER TABLE(约束)
-
CREATE PROJECTION
-
CREATE VIEW
-
CREATE SEQUENCE
-
CREATE ACCESS POLICY
-
创建过程(存储过程)
以下输出包含输出 SQL 文件的开头和结尾,包括 MARK_DESIGN_KSAFE 语句:
CREATE SCHEMA store;
CREATE SCHEMA online_sales;
CREATE SEQUENCE public.my_seq ;
CREATE TABLE public.customer_dimension
(
customer_key int NOT NULL,
customer_type varchar(16),
customer_name varchar(256),
customer_gender varchar(8),
title varchar(8),
household_id int,
...
);
...
SELECT MARK_DESIGN_KSAFE(1);
导出单个对象
您可以指定一个或多个对象作为函数范围,其中多个对象是在逗号分隔的列表中指定的。任何非 PUBLIC 架构中的对象名称都必须包含它们各自的架构。要导出的对象可以包含架构、表、视图和序列。因此,SQL 脚本包含以下语句,具体取决于列出的对象及其依赖关系:
-
CREATE SCHEMA
-
CREATE TABLE
-
ALTER TABLE(用于添加约束)
-
CREATE VIEW
-
CREATE SEQUENCE
-
CREATE ACCESS POLICY
如果列出的对象有重叠的范围(例如列表包含一个表和它的一个投影),则 EXPORT_OBJECTS 只导出一次投影:
=> select export_objects ('','customer_dimension, customer_dimension_super');
export_objects
--------------------------------------------------------------------------
CREATE TABLE public.customer_dimension
(
customer_key int NOT NULL,
customer_type varchar(16),
customer_name varchar(256),
...
CONSTRAINT C_PRIMARY PRIMARY KEY (customer_key) DISABLED
);
CREATE ACCESS POLICY ON public.customer_dimension FOR COLUMN customer_address CASE WHEN enabled_role('administrator') THEN customer_address ELSE '**************' END ENABLE;
CREATE PROJECTION public.customer_dimension_super /*+basename(customer_dimension),createtype(L)*/
(
customer_key,
customer_type,
customer_name,
...
)
AS
SELECT customer_dimension.customer_key,
customer_dimension.customer_type,
customer_dimension.customer_name,
...
FROM public.customer_dimension
ORDER BY customer_dimension.customer_key
SEGMENTED BY hash(customer_dimension.customer_key) ALL NODES OFFSET 0;
SELECT MARK_DESIGN_KSAFE(0);