云服务器内容精选

  • 注意事项 当前会话的用户必须是指定的rolename角色的成员,但系统管理员可以选择任何角色。 使用这条命令,它可能会增加一个用户的权限,也可能会限制一个用户的权限。如果会话用户的角色有INHERITS属性,则它自动拥有它能SET ROLE变成的角色的所有权限;在这种情况下,SET ROLE实际上是删除了所有直接赋予会话用户的权限,以及它的所属角色的权限,只剩下指定角色的权限。另一方面,如果会话用户的角色有NOINHERITS属性,SET ROLE删除直接赋予会话用户的权限,而获取指定角色的权限。
  • 示例 修改现有名为hdfs_server的address: 1 ALTER SERVER hdfs_server OPTIONS ( SET address '10.10.0.110:25000,10.10.0.120:25000'); 修改现有名为hdfs_server的hdfscfgpath: 1 ALTER SERVER hdfs_server OPTIONS ( SET hdfscfgpath '/opt/bigdata/hadoop');
  • 参数说明 server_name 所修改的server的名字。 new_version 修改后server的新版本名称。 修改server所支持的OPTIONS如下所示: address OBS服务的终端节点(Endpoint)。 HDFS集群的主备节点所在的IP地址以及端口。 对于HDFS server,address必须存在,所以ADD和DROP操作不被允许。 address目前只支持点分十进制格式的IPv4格式,且address字符串中不能出现空格,多组address以逗号作为分隔符。ip和port之间使用“:”来区分。HDFS集群中ip、port组对推荐设置两组,分别对应HDFS NameNode主备节点的address。 当server类型为 DLI 时,address为DLI服务上数据所存储的OBS address。 hdfscfgpath HDFS集群的配置文件。 若HDFS走安全模式时,hdfscfgpath是必选项,否则为可选项。 若设置hdfscfgpath时,path仅能设置一个。 fed 表示dfs_fdw连接的是HDFS为联邦模式。 取值rbf,表示HDFS为联邦rbf方式。 该参数8.1.2及以上版本支持;8.0.0基线版本下,仅8.0.0.10及以上版本支持。 encrypt 是否对数据进行加密,该参数仅支持在type为OBS时设置。默认值为off。 取值范围: on表示对数据进行加密。 off表示不对数据进行加密。 access_key OBS访问协议对应的AK值(OBS云服务界面由用户获取),创建外表时AK值会加密保存到数据库的元数据表中。该参数仅支持type为OBS时设置。 secret_access_key OBS访问协议对应的SK值(OBS云服务界面由用户获取),创建外表时SK值会加密保存到数据库的元数据表中。该参数仅支持type为OBS时设置。 dli_address DLI服务的终端节点,即endpoint。该参数仅支持type为DLI时设置。 dli_access_key DLI访问协议对应的AK值(DLI云服务界面由用户获取),创建外表时AK值会保存到数据库的元数据表中。该参数仅支持type为DLI时设置。 dli_secret_access_key DLI访问协议对应的SK值(DLI云服务界面由用户获取),创建外表时SK值会加密保存到数据库的元数据表中。该参数仅支持type为DLI时设置。 region 此参数表示OBS服务的IP地址或者 域名 信息。该参数仅支持type为OBS时设置。 dbname 用于协同分析、跨集群互联互通,表示将要连接的远端集群的数据库名字。 username 用于协同分析、跨集群互联互通,表示将要连接的远端集群的用户名。 password 用于协同分析、跨集群互联互通,表示将要连接的远端集群的用户名密码。 syncsrv 仅用于跨集群互联互通,表示数据同步过程中使用到的GDS服务,设置方式与GDS外表的location属性相同。该参数仅8.1.2及以上版本支持。 new_owner 修改后server的新拥有者。更改所有者,必须是外部服务器的所有者并且也是新的所有者角色的直接或者间接成员,并且必须对外部服务器的外部数据封装器有USAGE权限。 new_name 修改后server的新名字。 REFRESH OPTIONS 刷新HDFS的配置文件信息,在配置文件有变动时执行,若不执行可能会访问报错。
  • 语法格式 修改外部服务的参数。 1 2 ALTER SERVER server_name [ VERSION 'new_version' ] [ OPTIONS ( {[ ADD | SET | DROP ] option ['value']} [, ... ] ) ]; 在OPTIONS选项里,ADD、SET和DROP指定要执行的操作,未指定时默认为ADD操作。option和value为对应操作的参数。 对于HDFS Server目前只支持SET操作,ADD/DROP操作现有版本不支持。语法中SET和DROP操作语法依然保留,以便后续扩展使用。 修改外部服务的所有者。 1 2 ALTER SERVER server_name OWNER TO new_owner; 修改外部服务的名字。 1 2 ALTER SERVER server_name RENAME TO new_name; 刷新HDFS配置文件。仅8.0.0.10及以上版本支持(8.1.0除外)。 1 ALTER SERVER server_name REFRESH OPTIONS;
  • 参数说明 ONLY 如果声明ONLY,只有指定的表会被清空。如果没有声明ONLY,这个表以及其所有子表(若有)会被清空。 database_name 目标表的数据库名称。 schema_name 目标表的模式名称。 table_name 目标表的名字(可以有模式修饰)。 取值范围:已存在的表名。 CONTINUE IDENTITY 不改变序列的值。这是缺省值。 CASCADE | RESTRICT CASCADE:级联清空所有在该表上有外键引用的表,或者由于CASCADE而被添加到组中的表。 RESTRICT(缺省值):如果其他表在该表上有外键引用则拒绝清空。 partition_name 目标分区表的分区名。 取值范围:已存在的分区名。 partition_value 指定的分区键值。 通过PARTITION FOR子句指定的这一组值,可以唯一确定一个分区。 取值范围:需要进行删除数据分区的分区键的取值范围。 使用PARTITION FOR子句时,partition_value所在的整个分区会被清空。
  • 示例 创建分区表customer_address: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 DROP TABLE IF EXISTS customer_address; CREATE TABLE customer_address ( ca_address_sk INTEGER NOT NULL , ca_address_id CHARACTER(16) NOT NULL , ca_street_number CHARACTER(10) , ca_street_name CHARACTER varying(60) , ca_street_type CHARACTER(15) , ca_suite_number CHARACTER(10) ) DISTRIBUTE BY HASH (ca_address_sk) PARTITION BY RANGE(ca_address_sk) ( PARTITION P1 VALUES LESS THAN(2450815), PARTITION P2 VALUES LESS THAN(2451179), PARTITION P3 VALUES LESS THAN(2451544), PARTITION P4 VALUES LESS THAN(MAXVALUE) ); 清空表customer_address分区p1: 1 ALTER TABLE customer_address TRUNCATE PARTITION p1; 清空分区表: 1 TRUNCATE TABLE customer_address;
  • 语法格式 清理表数据。 1 2 TRUNCATE [ TABLE ] [ ONLY ] {[[database_name.]schema_name.]table_name [ * ]} [, ... ] [ CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]; 清理表分区的数据。 1 2 3 4 5 ALTER TABLE [ IF EXISTS ] { [ ONLY ] [[database_name.]schema_name.]table_name | table_name * | ONLY ( table_name ) } TRUNCATE PARTITION { partition_name | FOR ( partition_value [, ...] ) } ;
  • 注意事项 TRUNCATE TABLE在功能上与不带WHERE子句DELETE语句相同:二者均删除表中的全部行。 TRUNCATE TABLE比DELETE速度快且使用系统和事务日志资源少: DELETE语句每次删除一行,并在事务日志中为所删除每行记录一项。 TRUNCATE TABLE通过释放存储表数据所用数据页来删除数据,并且只在事务日志中记录页的释放。 TRUNCATE,DELETE,DROP三者的差异如下: TRUNCATE TABLE,删除内容,释放空间,但不删除定义。 DELETE TABLE,删除内容,不删除定义,不释放空间。 DROP TABLE,删除内容和定义,释放空间。
  • 参数说明 ONLY 如果声明ONLY,只有指定的表会被清空。如果没有声明ONLY,这个表以及其所有子表(若有)会被清空。 database_name 目标表的数据库名称。 schema_name 目标表的模式名称。 table_name 目标表的名字(可以有模式修饰)。 取值范围:已存在的表名。 CONTINUE IDENTITY 不改变序列的值。这是缺省值。 CASCADE | RESTRICT CASCADE:级联清空所有在该表上有外键引用的表,或者由于CASCADE而被添加到组中的表。 RESTRICT(缺省值):如果其他表在该表上有外键引用则拒绝清空。
  • TRUNCATE TABLE说明 TRUNCATE TABLE在功能上与不带WHERE子句DELETE语句相同:二者均删除表中的全部行。 TRUNCATE TABLE比DELETE速度快且使用系统和事务日志资源少: DELETE语句每次删除一行,并在事务日志中为所删除每行记录一项。 TRUNCATE TABLE通过释放存储表数据所用数据页来删除数据,并且只在事务日志中记录页的释放。 TRUNCATE,DELETE,DROP三者的差异如下: TRUNCATE TABLE,删除内容,释放空间,但不删除定义。 DELETE TABLE,删除内容,不删除定义,不释放空间。 DROP TABLE,删除内容和定义,释放空间。
  • 参数说明 policy_name 行访问控制策略名称,同一个数据表上行访问控制策略名称不能相同。 table_name 行访问控制策略的表名。 PERMISSIVE 指定行访问控制策略的类型为宽容性策略。对于一个给定的查询,将使用“OR”操作符将所有的宽容性策略组合。行访问控制策略的类型默认为宽容性策略。 RESTRICTIVE 指定行访问控制策略的类型为限制性策略。对于一个给定的查询,将使用“AND”操作符将所有的限制性策略组合。 至少需要一条宽容性策略允许对记录的访问。如果只有限制性策略存在,则不能访问任何记录。当宽容性和限制性策略共存时,只有当记录能通过至少一条宽容性策略以及所有的限制性策略时,该记录才能访问。 command 当前行访问控制影响的SQL操作,可指定操作包括:ALL、SELECT、UPDATE、DELETE。当未指定时,ALL为默认值,涵盖SELECT、UPDATE、DELETE操作。 当command为SELECT时,SELECT类操作受行访问控制的影响,只能查看到满足条件(using_expression返回值为TRUE)的元组数据,受影响的操作包括SELECT,UPDATE ... RETURNING,DELETE ... RETURNING。 当command为UPDATE时,UPDATE类操作受行访问控制的影响,只能更新满足条件(using_expression返回值为TRUE)的元组数据,受影响的操作包括UPDATE,UPDATE ... RETURNING,SELECT ... FOR UPDATE/SHARE。 当command为DELETE时,DELETE类操作受行访问控制的影响,只能删除满足条件(using_expression返回值为TRUE)的元组数据,受影响的操作包括DELETE,DELETE ... RETURNING。 行访问控制策略与适配的SQL语法关系参见下表: 表1 ROW LEVEL SECURITY策略与适配SQL语法关系 Command SELECT/ALL policy UPDATE/ALL policy DELETE/ALL policy SELECT Existing row No No SELECT FOR UPDATE/SHARE Existing row Existing row No UPDATE No Existing row No UPDATE RETURNING Existing row Existing row No DELETE No No Existing row DELETE RETURNING Existing row No Existing row role_name 行访问控制影响的数据库用户。 当未指定时,PUBLIC为默认值,PUBLIC表示影响所有数据库用户,可以指定多个受影响的数据库用户。 系统管理员不受行访问控制特性影响。
  • 示例 创建用户alice: 1 CREATE ROLE alice PASSWORD '{Password}'; 创建用户bob: 1 CREATE ROLE bob PASSWORD '{Password}'; 创建数据表public.all_data: 1 CREATE TABLE public.all_data(id int, role varchar(100), data varchar(100)); 向数据表插入数据: 1 2 3 INSERT INTO all_data VALUES(1, 'alice', 'alice data'); INSERT INTO all_data VALUES(2, 'bob', 'bob data'); INSERT INTO all_data VALUES(3, 'peter', 'peter data'); 将表all_data的读取权限赋予alice和bob用户: 1 GRANT SELECT ON all_data TO alice, bob; 打开行访问控制策略开关: 1 ALTER TABLE all_data ENABLE ROW LEVEL SECURITY; 创建行访问控制策略,当前用户只能查看用户自身的数据: 1 CREATE ROW LEVEL SECURITY POLICY all_data_rls ON all_data USING(role = CURRENT_USER); 查看表all_data相关信息: 1 \d+ all_data 图1 查看all_data相关信息 当前用户执行SELECT操作: 1 SELECT * FROM all_data; 图2 SELECT操作 1 EXPLAIN(COSTS OFF) SELECT * FROM all_data; 图3 EXPLAIN操作 切换至alice用户: 1 SET ROLE alice PASSWORD '{Password}'; 执行SELECT操作: 1 SELECT * FROM all_data; 图4 执行SELECT操作 1 EXPLAIN(COSTS OFF) SELECT * FROM all_data; 图5 执行EXPLAIN操作
  • 注意事项 支持对行存表、行存分区表、列存表、列存分区表、复制表、unlogged表、hash表定义行访问控制策略。 不支持HDFS表、外表、临时表定义行访问控制策略。 不支持对视图定义行访问控制策略。 同一张表上可以创建多个行访问控制策略,一张表最多创建100个行访问控制策略。 具有管理员权限的用户、初始运维用户(Ruby)和表的拥有者不受行访问控制影响,可以查看表的全量数据。 通过SQL语句、视图、函数、存储过程查询包含行访问控制策略的表,都会受影响。 不支持对行访问控制策略依赖的列进行类型修改。例如,不支持如下修改: 1 ALTER TABLE public.all_data ALTER COLUMN role TYPE text;
  • 功能描述 对表创建行访问控制策略。 对表创建行访问控制策略时,需打开该表的行访问控制开关(ALTER TABLE ... ENABLE ROW LEVEL SECURITY)策略才能生效,否则不生效。 当前行访问控制会影响数据表的读取操作(SELECT、UPDATE、DELETE),暂不影响数据表的写入操作(INSERT、MERGE INTO)。表所有者或系统管理员可以在USING子句中创建表达式,并在客户端执行数据表读取操作时,数据库后台在查询重写阶段会将满足条件的表达式拼接并应用到执行计划中。针对数据表的每一条元组,当USING表达式返回TRUE时,元组对当前用户可见,当USING表达式返回FALSE或NULL时,元组对当前用户不可见。 行访问控制策略名称是针对表的,同一个数据表上不能有同名的行访问控制策略;对不同的数据表,可以有同名的行访问控制策略。 行访问控制策略可以应用到指定的操作(SELECT、UPDATE、DELETE、ALL),ALL表示会影响SELECT、UPDATE、DELETE三种操作;定义行访问控制策略时,若未指定受影响的相关操作,默认为ALL。 行访问控制策略可以应用到指定的用户(角色),也可应用到全部用户(PUBLIC);定义行访问控制策略时,若未指定受影响的用户,默认为PUBLIC。
  • 语法格式 1 2 3 4 5 CREATE [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name [ AS { PERMISSIVE | RESTRICTIVE } ] [ FOR { ALL | SELECT | UPDATE | DELETE } ] [ TO { role_name | PUBLIC } [, ...] ] USING ( using_expression )