华为云用户手册

  • UNION,CASE和相关构造解析 如果所有输入都是相同的类型,并且不是unknown类型,那么解析成这种类型。 如果所有输入都是unknown类型则解析成text类型(字符串类型范畴的首选类型)。否则,忽略unknown输入。 如果输入不属于同一个类型范畴,失败。(unknown类型除外) 如果输入类型是同一个类型范畴,则选择该类型范畴的首选类型。(例外:union操作会选择第一个分支的类型作为所选类型。) 系统表pg_type中typcategory表示数据类型范畴,typispreferred表示是否是typcategory分类中的首选类型。 把所有输入转换为所选的类型(对于字符串保持原有长度)。如果从给定的输入到所选的类型没有隐式转换则失败。 若输入中含json、txid_snapshot、sys_refcursor或几何类型,则不能进行union。
  • 常量与宏 GaussDB 支持的常量和宏请参见表1。 表1 常量和宏 参数 描述 示例 CURRENT_CATA LOG 当前数据库 1 2 3 4 5 openGauss=# SELECT CURRENT_CATALOG; current_database ------------------ openGauss (1 row) CURRENT_ROLE 当前用户 1 2 3 4 5 openGauss=# SELECT CURRENT_ROLE; current_user -------------- omm (1 row) CURRENT_SCHEMA 当前数据库模式 1 2 3 4 5 openGauss=# SELECT CURRENT_SCHEMA; current_schema ---------------- public (1 row) CURRENT_USER 当前用户 1 2 3 4 5 openGauss=# SELECT CURRENT_USER; current_user -------------- omm (1 row) LOCALTIMESTAMP 当前会话时间(无时区) 1 2 3 4 5 openGauss=# SELECT LOCALTIMESTAMP; timestamp ---------------------------- 2015-10-10 15:37:30.968538 (1 row) NULL 空值 - SESSION_USER 当前系统用户 1 2 3 4 5 openGauss=# SELECT SESSION_USER; session_user -------------- omm (1 row) SYSDATE 当前系统日期 1 2 3 4 5 openGauss=# SELECT SYSDATE; sysdate --------------------- 2015-10-10 15:48:53 (1 row) USER 当前用户,此用户为CURRENT_USER的别名。 1 2 3 4 5 openGauss=# SELECT USER; current_user -------------- omm (1 row) 父主题: SQL参考
  • 操作步骤 使用CREATE TEMP TABLE AS语句创建表customer_t的临时表副本customer_t_temp。 1 openGauss=# CREATE TEMP TABLE customer_t_temp AS SELECT * FROM customer_t; 与使用永久表相比,使用临时表可以提高性能,但存在丢失数据的风险。临时表只在当前会话可见,本会话结束后将自动删除。如果数据丢失是不可接受的,请使用永久表。 临时表与普通表的存放位置无差,也可指定tablespace存放。本地临时表应用过多可能会导致系统表膨胀,但总体影响在可接受范围内。 截断当前表customer_t。 1 openGauss=# TRUNCATE customer_t; 使用INSERT INTO…SELECT语句从副本中向原始表中填充数据。 1 openGauss=# INSERT INTO customer_t (SELECT * FROM customer_t_temp); 删除临时表副本customer_t_temp。 1 openGauss=# DROP TABLE customer_t_temp;
  • 恢复控制函数 恢复信息函数提供了当前备机状态的信息。这些函数可能在恢复期间或正常运行中执行。 pg_is_in_recovery() 描述:如果恢复仍然在进行中则返回true。 返回值类型:bool pg_last_xlog_receive_location() 描述:获取最后接收事务日志的位置并通过流复制将其同步到磁盘。当流复制正在进行时,事务日志将持续递增。如果恢复已完成,则最后一次获取的WAL记录会被静态保持并在恢复过程中同步到磁盘。如果流复制不可用,或还没有开始,这个函数返回NULL。 返回值类型:text pg_last_xlog_replay_location() 描述:获取最后一个事务日志在恢复时重放的位置。如果恢复仍在进行,事务日志将持续递增。如果已经完成恢复,则将保持在恢复期间最后接收WAL记录的值。如果未进行恢复但服务器正常启动时,则这个函数返回NULL。 返回值类型:text pg_last_xact_replay_timestamp() 描述:获取最后一个事务在恢复时重放的时间戳。这是为在主节点上生成事务提交或终止WAL记录的时间。如果在恢复时没有事务重放,则这个函数返回NULL。如果恢复仍在进行,则事务日志将持续递增。如果恢复已经完成,则将保持在恢复期间最后接收WAL记录的值。如果服务器无需恢复就已正常启动,则这个函数返回NULL。 返回值类型:timestamp with time zone 恢复控制函数控制恢复的进程。这些函数可能只在恢复时被执行。 pg_is_xlog_replay_paused() 描述:如果恢复暂停则返回true。 返回值类型:bool pg_xlog_replay_pause() 描述:立即暂停恢复。 返回值类型:void pg_xlog_replay_resume() 描述:如果恢复处于暂停状态,则重新启动。 返回值类型:void gs_get_active_archiving_standby() 描述:查询同一分片内归档备机的信息。返回备机名,备机归档位置和已归档日志个数。 返回值类型:text,text,int gs_pitr_get_warning_for_xlog_force_recycle() 描述:查询开启归档后是否因归档槽不推进日志大量堆积导致日志被回收。 返回值类型:bool gs_pitr_clean_history_global_barriers(stop_barrier_timestamp cstring) 描述:清理指定时间之前所有barrier记录。返回最老的barrier记录。入参为cstring类型,linux时间戳。需要管理员角色或运维管理员角色执行。 返回值类型:text gs_pitr_archive_slot_force_advance(stop_barrier_timestamp cstring) 描述:强制推进归档槽,并清理不需要的barrier记录。返回新的归档槽位置。入参为cstring类型,linux时间戳。需要管理员角色或运维管理员角色执行。 返回值类型:text 当恢复暂停时,没有发生数据库更改。如果是在热备里,所有新的查询将看到一致的数据库快照,并且不会有进一步的查询冲突产生,直到恢复继续。 如果不能使用流复制,则暂停状态将无限的延续。当流复制正在进行时,将连续接收WAL记录,最终将填满可用磁盘空间,这个进度取决于暂停的持续时间,WAL生成的速度和可用的磁盘空间。
  • 备份控制函数 备份控制函数可帮助进行在线备份。 pg_create_restore_point(name text) 描述:为执行恢复创建一个命名点。(需要管理员角色) 返回值类型:text 备注:pg_create_restore_point创建了一个可以用作恢复目的、有命名的事务日志记录,并返回相应的事务日志位置。在恢复过程中,recovery_target_name可以通过这个名称定位对应的日志恢复点,并从此处开始执行恢复操作。避免使用相同的名称创建多个恢复点,因为恢复操作将在第一个匹配(恢复目标)的名称上停止。 pg_current_xlog_location() 描述:获取当前事务日志的写入位置。 返回值类型:text 备注:pg_current_xlog_location使用与前面那些函数相同的格式显示当前事务日志的写入位置。如果是只读操作,不需要系统管理员权限。 pg_current_xlog_insert_location() 描述:获取当前事务日志的插入位置。 返回值类型:text 备注:pg_current_xlog_insert_location显示当前事务日志的插入位置。插入点是事务日志在某个瞬间的“逻辑终点”,而实际的写入位置则是从服务器内部缓冲区写出时的终点。写入位置是可以从服务器外部检测到的终点,如果要归档部分完成事务日志文件,则该操作即可实现。插入点主要用于服务器调试目的。如果是只读操作,不需要系统管理员权限。 gs_current_xlog_insert_end_location() 描述:获取当前事务日志的插入位置。 返回值类型:text 备注:gs_current_xlog_insert_end_location显示当前事务日志的实际插入位置。 pg_start_backup(label text [, fast boolean ]) 描述:开始执行在线备份。(需要管理员角色或复制的角色) 返回值类型:text 备注:pg_start_backup接受一个用户定义的备份标签(通常这是备份转储文件存放地点的名称)。这个函数向数据库的数据目录写入一个备份标签文件,然后以文本方式返回备份的事务日志起始位置。 1 2 3 4 5 openGauss=# SELECT pg_start_backup('label_goes_here'); pg_start_backup ----------------- 0/3000020 (1 row) pg_stop_backup() 描述:完成执行在线备份。(需要管理员角色或复制的角色) 返回值类型:text 备注:pg_stop_backup删除pg_start_backup创建的标签文件,并且在事务日志归档区里创建一个备份历史文件。这个历史文件包含给予pg_start_backup的标签、备份的事务日志起始与终止位置、备份的起始和终止时间。返回值是备份的事务日志终止位置。计算出中止位置后,当前事务日志的插入点将自动前进到下一个事务日志文件,这样,结束的事务日志文件可以被立即归档从而完成备份。 pg_switch_xlog() 描述:切换到一个新的事务日志文件。(需要管理员角色) 返回值类型:text 备注:pg_switch_xlog移动到下一个事务日志文件,以允许将当前日志文件归档(假定使用连续归档)。返回值是刚完成的事务日志文件的事务日志结束位置+1。如果从最后一次事务日志切换以来没有活动的事务日志,则pg_switch_xlog什么事也不做,直接返回当前事务日志文件的开始位置。 pg_xlogfile_name(location text) 描述:将事务日志的位置字符串转换为文件名。 返回值类型:text 备注:pg_xlogfile_name仅抽取事务日志文件名称。如果给定的事务日志位置恰好位于事务日志文件的交界上,这两个函数都返回前一个事务日志文件的名称。这对于管理事务日志归档来说是非常有利的,因为前一个文件是当前最后一个需要归档的文件。 pg_xlogfile_name_offset(location text) 描述:将事务日志的位置字符串转换为文件名并返回在文件中的字节偏移量。 返回值类型:text,integer 备注:可以使用pg_xlogfile_name_offset从前述函数的返回结果中抽取相应的事务日志文件名称和字节偏移量。例如: 1 2 3 4 5 6 7 openGauss=# SELECT * FROM pg_xlogfile_name_offset(pg_stop_backup()); NOTICE: pg_stop_backup cleanup done, waiting for required WAL segments to be archived NOTICE: pg_stop_backup complete, all required WAL segments have been archived file_name | file_offset --------------------------+------------- 000000010000000000000003 | 272 (1 row) pg_xlog_location_diff(location text, location text) 描述:计算两个事务日志位置之间在字节上的区别。 返回值类型:numeric pg_cbm_tracked_location() 描述:用于查询cbm解析到的lsn位置。 返回值类型:text pg_cbm_get_merged_file(startLSNArg text, endLSNArg text) 描述:用于将指定lsn范围之内的cbm文件合并成一个cbm文件,并返回合并完的cbm文件名。 返回值类型:text 备注:必须是系统管理员或运维管理员才能获取cbm合并文件。 pg_cbm_get_changed_block(startLSNArg text, endLSNArg text) 描述:用于将指定lsn范围之内的cbm文件合并成一个表,并返回表的各行记录。 返回值类型:records 备注:pg_cbm_get_changed_block返回的表字段包含:合并起始的lsn,合并截止的lsn, 表空间oid,库oid,表的relfilenode,表的fork number,表是否被删除,表是否被创建,表是否被截断,表被截断后的页面数,有多少页被修改以及被修改的页号的列表。 pg_cbm_recycle_file(targetLSNArg text) 描述:删除不再使用的cbm文件,并返回删除后的第一条lsn。 返回值类型:text pg_cbm_force_track(targetLSNArg text,timeOut int) 描述:强制执行一次cbm追踪到指定的xlog位置,并返回实际追踪结束点的xlog位置。 返回值类型:text pg_enable_delay_ddl_recycle() 描述:开启延迟DDL功能,并返回开启点的xlog位置。需要管理员角色或运维管理员角色打开operation_mode。 返回值类型:text pg_disable_delay_ddl_recycle(barrierLSNArg text, isForce bool) 描述:关闭延迟DDL功能,并返回本次延迟DDL生效的xlog范围。需要管理员角色或运维管理员角色打开operation_mode。 返回值类型:records pg_enable_delay_xlog_recycle() 描述:开启延迟xlog回收功能,数据库主节点修复使用。 返回值类型:void pg_disable_delay_xlog_recycle() 描述:关闭延迟xlog回收功能,数据库主节点修复使用。 返回值类型:void pg_cbm_rotate_file(rotate_lsn text) 描述:等待cbm解析到rotate_lsn之后,强制切换文件,在build期间调用。 返回值类型:void。 gs_roach_stop_backup(backupid text) 描述:停止一个内部备份工具GaussRoach开启的备份。与pg_stop_backup系统函数类似,但更轻量。 返回值类型:text,内容为当前日志的插入位置。 gs_roach_enable_delay_ddl_recycle(backupid name) 描述:开启延迟DDL功能,并返回开启点的日志位置。与pg_enable_delay_ddl_recycle系统函数类似,但更轻量。并且,通过传入不同的backupid,可以支持并发打开延迟DDL。 返回值类型:text,内容为返回开启点的日志位置。 gs_roach_disable_delay_ddl_recycle(backupid text) 描述:关闭延迟DDL功能,并返回本次延迟DDL生效的日志范围,并删除该范围内被用户删除的列存表物理文件。与pg_enable_delay_ddl_recycle系统函数类似,但更轻量。并且,通过传入不同的backupid,可以支持并发关闭延迟DDL功能。 返回值类型:records,内容为本次延迟DDL生效的日志范围。 gs_roach_switch_xlog(request_ckpt bool) 描述:切换当前使用的日志段文件,并且,如果request_ckpt为true,则触发一个全量检查点。 返回值类型:text,内容为切段日志的位置。 gs_block_dw_io(timeout int, identifier text) 描述:阻塞双写页面刷盘。 参数说明: timeout 阻塞时长。 取值范围:[0, 3600](秒),0为阻塞时长为0。 identifier 此次操作的标识。 取值范围:字符串,不支持除大小写字母,数字,以及下划线(_)以外的字符。 返回值类型:bool 备注:调用该函数的用户需要具有SYSADMIN权限或具有OPRADMIN权限,运维管理员角色须打开operate_mode。 gs_is_dw_io_blocked() 描述:查看当前双写页面刷盘是否被阻塞,如果处于阻塞中则返回true。 返回值类型:bool 备注:调用该函数的用户需要具有SYSADMIN权限或具有OPRADMIN权限,运维管理员角色须打开operate_mode。
  • 操作步骤 参考连接数据库,连接数据库。 检查审计总开关状态。 用show命令显示审计总开关audit_enabled的值。 1 openGauss=# SHOW audit_enabled; 如果显示为off,执行“\q”命令退出数据库。 设置“audit_enabled=on”开启审计功能,参数设置立即生效。 根据表1,配置具体的审计项。 只有开启审计功能,用户的操作才会被记录到审计文件中。 各审计项的默认参数都符合安全标准,用户可以根据需要开启其他审计功能,但会对性能有一定影响。
  • 背景信息 数据库安全对数据库系统来说至关重要。GaussDB将用户对数据库的所有操作写入审计日志。数据库安全管理员可以利用这些日志信息,重现导致数据库现状的一系列事件,找出非法操作的用户、时间和内容等。 关于审计功能,用户需要了解以下几点内容: 审计总开关audit_enabled支持动态加载。在数据库运行期间修改该配置项的值会立即生效,无需重启数据库。默认值为on,表示开启审计功能。 除了审计总开关,各个审计项也有对应的开关。只有开关开启,对应的审计功能才能生效。 各审计项的开关支持动态加载。在数据库运行期间修改审计开关的值,不需要重启数据库便可生效。 目前,GaussDB支持以下审计项如表1所示。 表1 配置审计 项 配置项 描述 用户登录、注销审计 参数:audit_login_logout 默认值为7,表示开启用户登录、退出的审计功能。设置为0表示关闭用户登录、退出的审计功能。不推荐设置除0和7之外的值。 数据库启动、停止、恢复和切换审计 参数:audit_database_process 默认值为1,表示开启数据库启动、停止、恢复和切换的审计功能。 用户锁定和解锁审计 参数:audit_user_locked 默认值为1,表示开启审计用户锁定和解锁功能。 用户访问越权审计 参数:audit_user_violation 默认值为0,表示关闭用户越权操作审计功能。 授权和回收权限审计 参数:audit_grant_revoke 默认值为1,表示开启审计用户权限授予和回收功能。 数据库对象的CREATE,ALTER,DROP操作审计 参数:audit_system_object 默认值为67121159,表示只对DATABASE、SCHEMA、USER、DATA SOURCE,SQL Patch这五类数据库对象的CREATE、ALTER、DROP操作进行审计。 具体表的INSERT、UPDATE和DELETE操作审计 参数:audit_dml_state 默认值为0,表示关闭具体表的DML操作(SELECT除外)审计功能。 SELECT操作审计 参数:audit_dml_state_select 默认值为0,表示关闭SELECT操作审计功能。 COPY审计 参数:audit_copy_exec 默认值为1,表示开启copy操作审计功能。 存储过程和自定义函数的执行审计 参数:audit_function_exec 默认值为0,表示不记录存储过程和自定义函数的执行审计日志。 SET审计 参数:audit_set_parameter 默认值为0,表示不记录set操作审计日志 事务ID记录 参数:audit_xid_info 默认值为0,表示关闭审计日志记录事务ID功能。 安全相关参数及说明请参见表2。 表2 安全相关参数及说明 参数名 说明 ssl 指定是否启用SSL连接。 require_ssl 指定服务器端是否强制要求SSL连接。 ssl_ciphers 指定SSL支持的加密算法列表。 ssl_cert_file 指定包含SSL服务器证书的文件的名称。 ssl_key_file 指定包含SSL私钥的文件名称。 ssl_ca_file 指定包含CA信息的文件的名称。 ssl_crl_file 指定包含CRL信息的文件的名称。 password_policy 指定是否进行密码复杂度检查。 password_reuse_time 指定是否对新密码进行可重用天数检查。 password_reuse_max 指定是否对新密码进行可重用次数检查。 password_lock_time 指定帐户被锁定后自动解锁的时间。 failed_login_attempts 如果输入密码错误的次数达到此参数值时,当前帐户被锁定。 password_encryption_type 指定采用何种加密方式对用户密码进行加密存储。 password_min_uppercase 密码中至少需要包含大写字母的个数。 password_min_lowercase 密码中至少需要包含小写字母的个数。 password_min_digital 密码中至少需要包含数字的个数。 password_min_special 密码中至少需要包含特殊字符的个数。 password_min_length 密码的最小长度。 说明: 在设置此参数时,请将其设置成不大于password_max_length,否则进行涉及密码的操作会一直出现密码长度错误的提示 password_max_length 密码的最大长度。 说明: 在设置此参数时,请将其设置成不小于password_min_length,否则进行涉及密码的操作会一直出现密码长度错误的提示。 password_effect_time 密码的有效期限。 password_notify_time 密码到期提醒的天数。 audit_enabled 控制审计进程的开启和关闭。 audit_directory 审计文件的存储目录。 audit_data_format 审计日志文件的格式,当前仅支持二进制格式(binary)。 audit_rotation_interval 指定创建一个新审计日志文件的时间间隔。当现在的时间减去上次创建一个审计日志的时间超过了此参数值时,服务器将生成一个新的审计日志文件。 audit_rotation_size 指定审计日志文件的最大容量。当审计日志消息的总量超过此参数值时,服务器将生成一个新的审计日志文件。 audit_resource_policy 控制审计日志的保存策略,以空间还是时间限制为优先策略,on表示以空间为优先策略。 audit_file_remain_time 表示需记录审计日志的最短时间要求,该参数在audit_resource_policy为off时生效。 audit_space_limit 审计文件占用磁盘空间的最大值。 audit_file_remain_threshold 审计目录下审计文件的最大数量。 audit_login_logout 指定是否审计数据库用户的登录(包括登录成功和登录失败)、注销。 audit_database_process 指定是否审计数据库启动、停止、切换和恢复的操作。 audit_user_locked 指定是否审计数据库用户的锁定和解锁。 audit_user_violation 指定是否审计数据库用户的越权访问操作。 audit_grant_revoke 指定是否审计数据库用户权限授予和回收的操作。 audit_system_object 指定是否审计数据库对象的CREATE、DROP、ALTER操作。 audit_dml_state 指定是否审计具体表的INSERT、UPDATE、DELETE操作。 audit_dml_state_select 指定是否审计SELECT操作。 audit_copy_exec 指定是否审计COPY操作。 audit_function_exec 指定在执行存储过程、匿名块或自定义函数(不包括系统自带函数)时是否记录审计信息。 audit_set_parameter 指定是否审计SET操作。 enableSeparationOfDuty 指定是否开启三权分立。 session_timeout 建立连接会话后,如果超过此参数的设置时间,则会自动断开连接。 auth_iteration_count 认证加密信息生成过程中使用的迭代次数。
  • 示例1:通过本地文件导入导出数据 在使用JAVA语言基于GaussDB进行二次开发时,可以使用CopyManager接口,通过流方式,将数据库中的数据导出到本地文件或者将本地文件导入数据库中,文件格式支持 CS V、TEXT等格式。 样例程序如下,执行时需要加载GaussDB的JDBC驱动。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 import java.sql.Connection; import java.sql.DriverManager; import java.io.IOException; import java.io.FileInputStream; import java.io.FileOutputStream; import java.sql.SQLException; import org.postgresql.copy.CopyManager; import org.postgresql.core.BaseConnection; public class Copy{ public static void main(String[] args) { String urls = new String("jdbc:postgresql://localhost:8000/postgres"); //数据库URL String username = new String("username"); //用户名 String password = new String("passwd"); //密码 String tablename = new String("migration_table"); //定义表信息 String tablename1 = new String("migration_table_1"); //定义表信息 String driver = "org.postgresql.Driver"; Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(urls, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(System.out); } catch (SQLException e) { e.printStackTrace(System.out); } // 将表migration_table中数据导出到本地文件d:/data.txt try { copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //将d:/data.txt中的数据导入到migration_table_1中。 try { copyFromFile(conn, "d:/data.txt", tablename1); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 将表migration_table_1中的数据导出到本地文件d:/data1.txt try { copyToFile(conn, "d:/data1.txt", tablename1); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void copyFromFile(Connection connection, String filePath, String tableName) throws SQLException, IOException { FileInputStream fileInputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileInputStream = new FileInputStream(filePath); copyManager.copyIn("COPY " + tableName + " FROM STDIN ", fileInputStream); } finally { if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void copyToFile(Connection connection, String filePath, String tableOrQuery) throws SQLException, IOException { FileOutputStream fileOutputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileOutputStream = new FileOutputStream(filePath); copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT", fileOutputStream); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 父主题: 使用COPY FROM STDIN导入数据
  • 示例:通过本地文件导入导出数据 在使用JAVA语言基于GaussDB进行二次开发时,可以使用CopyManager接口,通过流方式,将数据库中的数据导出到本地文件或者将本地文件导入数据库中,文件格式支持CSV、TEXT等格式。 样例程序如下,执行示例前,需要加载驱动,驱动的获取和加载方法请参考JDBC包、驱动类和环境类。。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 import java.sql.Connection; import java.sql.DriverManager; import java.io.IOException; import java.io.FileInputStream; import java.io.FileOutputStream; import java.sql.SQLException; import org.postgresql.copy.CopyManager; import org.postgresql.core.BaseConnection; public class Copy{ public static void main(String[] args) { String urls = new String("jdbc:postgresql://$ip:$port/postgres"); //数据库URL String username = System.getenv("EXAMPLE_USERNAME_ENV"); //用户名 String password = System.getenv("EXAMPLE_PASSWORD_ENV"); //密码 String tablename = new String("migration_table"); //定义表信息 String tablename1 = new String("migration_table_1"); //定义表信息 String driver = "org.postgresql.Driver"; Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(urls, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(System.out); } catch (SQLException e) { e.printStackTrace(System.out); } // 将SELECT * FROM migration_table查询结果导出到本地文件d:/data.txt try { copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)"); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //将d:/data.txt中的数据导入到migration_table_1中。 try { copyFromFile(conn, "d:/data.txt", tablename1); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 将migration_table_1中的数据导出到本地文件d:/data1.txt try { copyToFile(conn, "d:/data1.txt", tablename1); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // 使用copyIn把数据从文件中导入数据库, public static void copyFromFile(Connection connection, String filePath, String tableName) throws SQLException, IOException { FileInputStream fileInputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileInputStream = new FileInputStream(filePath); copyManager.copyIn("COPY " + tableName + " FROM STDIN", fileInputStream); } finally { if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } // 使用copyOut把数据从数据库中导出到文件中 public static void copyToFile(Connection connection, String filePath, String tableOrQuery) throws SQLException, IOException { FileOutputStream fileOutputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileOutputStream = new FileOutputStream(filePath); copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT", fileOutputStream); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 父主题: 基于JDBC开发
  • 服务器信号函数 服务器信号函数向其他服务器进程发送控制信号。只有系统管理员才能使用这些函数。 pg_cancel_backend(pid int) 描述:取消一个后端的当前查询。 返回值类型:Boolean 备注:pg_cancel_backend向由pid标识的后端进程发送一个查询取消(SIGINT)信号。一个活动的后端进程的PID可以从pg_stat_activity视图的pid字段找到,或者在服务器上用ps列出数据库进程。具有SYSADMIN权限的用户,后端进程所连接的数据库的属主,后端进程的属主或者继承了内置角色gs_role_signal_backend权限的用户有权使用该函数。 pg_cancel_session(pid bigint, sessionid bigint) 描述:取消一个后台会话。 返回值类型:Boolean 备注:pg_cancel_session的入参可以通过pg_stat_activity中的pid字段和sessionid的字段查询,可以用于清理线程池模式下,非活跃状态的会话。 pg_reload_conf() 描述:导致所有服务器进程重新装载它们的配置文件(需要系统管理员角色)。 返回值类型:Boolean 备注:pg_reload_conf给服务器发送一个SIGHUP信号,导致所有服务器进程重新装载配置文件。 pg_rotate_logfile() 描述:滚动服务器的日志文件(需要系统管理员角色)。 返回值类型:Boolean 备注:pg_rotate_logfile给日志文件管理器发送信号,告诉它立即切换到一个新的输出文件。这个函数只有在redirect_stderr用于日志输出的时候才有用,否则根本不存在日志文件管理器子进程。 pg_terminate_backend(pid int) 描述:终止一个后台线程。 返回值类型:Boolean 备注:如果成功,函数返回true,否则返回false。具有SYSADMIN权限的用户,后端进程所连接的数据库的属主,后端进程的属主或者继承了内置角色gs_role_signal_backend权限的用户有权使用该函数。 示例: 1 2 3 4 5 6 7 8 9 10 11 openGauss=# SELECT pid from pg_stat_activity; pid ----------------- 140657876268816 (1 rows) openGauss=# SELECT pg_terminate_backend(140657876268816); pg_terminate_backend ---------------------- t (1 row) pg_terminate_session(pid int64, sessionid int64) 描述:终止一个后台session。 返回值类型:Boolean 备注:如果成功,函数返回true,否则返回false。具有SYSADMIN权限的用户,会话所连接的数据库的属主,会话的属主或者继承了内置角色gs_role_signal_backend权限的用户有权使用该函数。 父主题: 系统管理函数
  • FORALL批量查询语句 语法图 图5 forall::= 变量index会自动定义为integer类型并且只在此循环里存在。index的取值介于low_bound和upper_bound之间。 如果声明了SAVE EXCEPTIONS,则会将循环体DML执行过程中每次遇到的异常保存在SQL&BULK_EXCEPTIONS中,并在执行结束后统一抛出一个异常,循环过程中没有异常的执行的结果在当前子事务内不会回滚。 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 CREATE TABLE hdfs_t1 ( title NUMBER(6), did VARCHAR2(20), data_period VARCHAR2(25), kind VARCHAR2(25), interval VARCHAR2(20), time DATE, isModified VARCHAR2(10) ); INSERT INTO hdfs_t1 VALUES( 8, 'Donald', 'OConnell', 'DOCONNEL', '650.507.9833', to_date('21-06-1999', 'dd-mm-yyyy'), 'SH_CLERK' ); CREATE OR REPLACE PROCEDURE proc_forall() AS BEGIN FORALL i IN 100..120 update hdfs_t1 set title = title + 100*i; END; / --调用函数 CALL proc_forall(); --查询存储过程调用结果 SELECT * FROM hdfs_t1 WHERE title BETWEEN 100 AND 120; --删除存储过程和表 DROP PROCEDURE proc_forall; DROP TABLE hdfs_t1;
  • 注意事项 唯一约束和主键约束的约束键包含所有分区键将为约束创建LOCAL索引,否则创建GLOBAL索引。 目前哈希分区和列表分区仅支持单列构建分区键,暂不支持多列构建分区键。 只需要有间隔分区表的INSERT权限,往该表INSERT数据时就可以自动创建分区。 对于分区表PARTITION FOR (values)语法,values只能是常量。 对于分区表PARTITION FOR (values)语法,values在需要数据类型转换时,建议使用强制类型转换,以防隐式类型转换结果与预期不符。 分区数最大值为1048575个,一般情况下业务不可能创建这么多分区,这样会导致内存不足。应参照参数local_syscache_threshold的值合理创建分区,分区表使用内存大致为(分区数 * 3 / 1024)MB。理论上分区占用内存不允许大于local_syscache_threshold的值,同时还需要预留部分空间以供其他功能使用。 指定分区语句目前不能走全局索引扫描。
  • 参数说明 IF NOT EXISTS 如果已经存在相同名称的表,不会抛出一个错误,而会发出一个通知,告知表关系已存在。 partition_table_name 分区表的名称。 取值范围:字符串,要符合标识符的命名规范。 column_name 新表中要创建的字段名。 取值范围:字符串,要符合标识符的命名规范。 data_type 字段的数据类型。 COLLATE collation COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。排序规则可以使用“select * from pg_collation;”命令从pg_collation系统表中查询,默认的排序规则为查询结果中以default开始的行。 CONSTRAINT constraint_name 列约束或表约束的名称。可选的约束子句用于声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新。 定义约束有两种方法: 列约束:作为一个列定义的一部分,仅影响该列。 表约束:不和某个列绑在一起,可以作用于多个列。 LIKE source_table [ like_option ... ] LIKE子句声明一个表,新表自动从这个表里面继承所有字段名及其数据类型和非空约束。 和INHERITS不同,新表与原来的表之间在创建动作完毕之后是完全无关的。在源表做的任何修改都不会传播到新表中,并且也不可能在扫描源表的时候包含新表的数据。 字段缺省表达式只有在声明了INCLUDING DEFAULTS之后才会包含进来。缺省是不包含缺省表达式的,即新表中所有字段的缺省值都是NULL。 如果指定了INCLUDING GENERATED,则源表列的生成表达式会复制到新表中。默认不复制生成表达式。 非空约束将总是复制到新表中,CHECK约束则仅在指定了INCLUDING CONSTRAINTS的时候才复制,而其他类型的约束则永远也不会被复制。此规则同时适用于表约束和列约束。 和INHERITS不同,被复制的列和约束并不使用相同的名称进行融合。如果明确的指定了相同的名称或者在另外一个LIKE子句中,将会报错。 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。 如果指定了INCLUDING STORAGE,则拷贝列的STORAGE设置也将被拷贝,默认情况下不包含STORAGE设置。 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释也会被拷贝过来。默认情况下,不拷贝源表的注释。 如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH子句)也将拷贝至新表。默认情况下,不拷贝源表的存储参数。 INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION和INCLUDING RELOPTIONS的内容。 WITH ( storage_parameter [= value] [, ... ] ) 这个子句为表或索引指定一个可选的存储参数。参数的详细描述如下所示: FILLFACTOR 一个表的填充因子(fillfactor)是一个介于10和100之间的百分数。100(完全填充)是默认值。如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE有机会在同一页上放置同一条记录的新版本,这比把新版本放置在其他页上更有效。对于一个从不更新的表将填充因子设为100是最佳选择,但是对于频繁更新的表,选择较小的填充因子则更加合适。该参数对于列存表没有意义。 取值范围:10~100 ORIENTATION 决定了表的数据的存储方式。 取值范围: COLUMN:表的数据将以列式存储。 ROW(缺省值):表的数据将以行式存储。 orientation不支持修改。 STORAGE_TYPE 指定存储引擎类型,该参数设置成功后就不再支持修改。 取值范围: USTORE,表示表支持Inplace-Update存储引擎。特别需要注意,使用USTORE表,必须要开启track_counts和track_activities参数,否则会引起空间膨胀。 ASTORE,表示表支持Append-Only存储引擎。 默认值: 不指定表时,默认是Append-Only存储。 COMPRESSION 列存表的有效值为LOW/MIDDLE/HIGH/YES/NO,压缩级别依次升高,默认值为LOW。 行存表不支持压缩。 MAX_BATCHROW 指定了在数据加载过程中一个存储单元可以容纳记录的最大数目。该参数只对列存表有效。 取值范围:10000~60000,默认60000。 PARTIAL_CLUSTER_ROWS 指定了在数据加载过程中进行将局部聚簇存储的记录数目。该参数只对列存表有效。 取值范围:大于等于MAX_BATCHROW,建议取值为MAX_BATCHROW的整数倍数。 DELTAROW_THRESHOLD 预留参数。该参数只对列存表有效。 取值范围:0~9999 segment 使用段页式的方式存储。本参数仅支持行存表。不支持列存表、临时表、unlog表。不支持ustore存储引擎。 取值范围:on/off 默认值:off COMPRESS / NOCOMPRESS 创建一个新表时,需要在创建表语句中指定关键字COMPRESS,这样,当对该表进行批量插入时就会触发压缩特性。该特性会在页范围内扫描所有元组数据,生成字典、压缩元组数据并进行存储。指定关键字NOCOMPRESS则不对表进行压缩。行存表不支持压缩。 缺省值为NOCOMPRESS,即不对元组数据进行压缩。 TABLESPACE tablespace_name 指定新表将要在tablespace_name表空间内创建。如果没有声明,将使用默认表空间。 PARTITION BY RANGE(partition_key) 创建范围分区。partition_key为分区键的名称。 (1)对于从句是VALUES LESS THAN的语法格式: 对于从句是VALUE LESS THAN的语法格式,范围分区策略的分区键最多支持4列。 该情形下,分区键支持的数据类型为:SMALLINT、INTEGER、BIGINT、DECIMAL、NUMERIC、REAL、DOUBLE PRECISION、CHARACTER VARYING(n)、VARCHAR(n)、CHARACTER(n)、CHAR(n)、CHARACTER、CHAR、TEXT、NVARCHAR、NVARCHAR2、NAME、TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。 (2)对于从句是START END的语法格式: 对于从句是START END的语法格式,范围分区策略的分区键仅支持1列。 该情形下,分区键支持的数据类型为:SMALLINT、INTEGER、BIGINT、DECIMAL、NUMERIC、REAL、DOUBLE PRECISION、TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。 (3)对于指定了INTERVAL子句的语法格式: 对于指定了INTERVAL子句的语法格式,范围分区策略的分区键仅支持1列。 该情形下,分区键支持的数据类型为:TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。 PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } ) 指定各分区的信息。partition_name为范围分区的名称。partition_value为范围分区的上边界,取值依赖于partition_key的类型。MAXVALUE表示分区的上边界,它通常用于设置最后一个范围分区的上边界。 每个分区都需要指定一个上边界。 分区上边界的类型应当和分区键的类型一致。 分区列表是按照分区上边界升序排列的,值较小的分区位于值较大的分区之前。 PARTITION partition_name {START (partition_value) END (partition_value) EVERY (interval_value)} | {START (partition_value) END (partition_value|MAXVALUE)} | {START(partition_value)} | {END (partition_value | MAXVALUE)} 指定各分区的信息,各参数意义如下: partition_name:范围分区的名称或名称前缀,除以下情形外(假定其中的partition_name是p1),均为分区的名称。 若该定义是START+END+EVERY从句,则语义上定义的分区的名称依次为p1_1, p1_2, ...。例如对于定义“PARTITION p1 START(1) END(4) EVERY(1)”,则生成的分区是:[1, 2), [2, 3) 和 [3, 4),名称依次为p1_1, p1_2和p1_3,即此处的p1是名称前缀。 若该定义是第一个分区定义,且该定义有START值,则范围(MINVALUE, START)将自动作为第一个实际分区,其名称为p1_0,然后该定义语义描述的分区名称依次为p1_1, p1_2, ...。例如对于完整定义“PARTITION p1 START(1), PARTITION p2 START(2)”,则生成的分区是:(MINVALUE, 1), [1, 2) 和 [2, MAXVALUE),其名称依次为p1_0, p1_1和p2,即此处p1是名称前缀,p2是分区名称。这里MINVALUE表示最小值。 partition_value:范围分区的端点值(起始或终点),取值依赖于partition_key的类型,不可是MAXVALUE。 interval_value:对[START,END) 表示的范围进行切分,interval_value是指定切分后每个分区的宽度,不可是MAXVALUE;如果(END-START)值不能整除以EVERY值,则仅最后一个分区的宽度小于EVERY值。 MAXVALUE:表示最大值,它通常用于设置最后一个范围分区的上边界。 在创建分区表若第一个分区定义含START值,则范围(MINVALUE,START)将自动作为实际的第一个分区。 START END语法需要遵循以下限制: 每个partition_start_end_item中的START值(如果有的话,下同)必须小于其END值; 相邻的两个partition_start_end_item,第一个的END值必须等于第二个的START值; 每个partition_start_end_item中的EVERY值必须是正向递增的,且必须小于(END-START)值; 每个分区包含起始值,不包含终点值,即形如:[起始值,终点值),起始值是MINVALUE时则不包含; 一个partition_start_end_item创建的每个分区所属的TABLESPACE一样; partition_name作为分区名称前缀时,其长度不要超过57字节,超过时自动截断; 在创建、修改分区表时请注意分区表的分区总数不可超过最大限制(1048575); 在创建分区表时START END与LESS THAN语法不可混合使用。 即使创建分区表时使用START END语法,备份(gs_dump)出的SQL语句也是VALUES LESS THAN语法格式。 INTERVAL ('interval_expr') [ STORE IN (tablespace_name [, ... ] ) ] 间隔分区定义信息。 interval_expr:自动创建分区的间隔,例如:1 day、1 month。 STORE IN (tablespace_name [, ... ] ):指定存放自动创建分区的表空间列表,如果有指定,则自动创建的分区从表空间列表中循环选择使用,否则使用分区表默认的表空间。 列存表不支持间隔分区。 PARTITION BY LIST(partition_key) 创建列表分区。partition_key为分区键的名称。 对于partition_key,列表分区策略的分区键仅支持1列。 对于从句是VALUES (list_values)的语法格式,list_values中包含了对应分区存在的键值,每个分区的键值数量不超过64个。 分区键支持的数据类型为:INT1、INT2、INT4、INT8、NUMERIC、VARCHAR(n)、CHAR、BPCHAR、NVARCHAR、NVARCHAR2、TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。分区个数不能超过1048575个。 PARTITION BY HASH(partition_key) 创建哈希分区。partition_key为分区键的名称。 对于partition_key,哈希分区策略的分区键仅支持1列。 分区键支持的数据类型为:INT1、INT2、INT4、INT8、NUMERIC、VARCHAR(n)、CHAR、BPCHAR、TEXT、NVARCHAR、NVARCHAR2、TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。分区个数不能超过1048575个。 { ENABLE | DISABLE } ROW MOVEMENT 行迁移开关。 如果进行UPDATE操作时,更新了元组在分区键上的值,造成了该元组所在分区发生变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。 取值范围: ENABLE(缺省值):行迁移开关打开。 DISABLE:行迁移开关关闭。 在打开行迁移开关情况下,并发update、delete操作可能会报错,原因如下: 目前GaussDB astore引擎下,update和delete操作对于旧数据都是标记为已删除。在打开行迁移开关情况下,如果更新分区键时,导致了跨分区更新,目前GaussDB astore引擎下,会把旧分区中旧数据标记为已删除,在新分区中新增加一条数据,无法通过旧数据找到新数据。 在update和update并发、delete和delete并发、update和delete并发三个并发场景下,如果并发操作同一行数据时,数据跨分区和非跨分区结果有不同的行为。 对于数据非跨分区结果,第一个操作执行完后,第二个操作不会报错。 如果第一个操作是update,第二个操作能成功找到最新的数据,之后对新数据操作。 如果第一个操作是delete,第二个操作看到当前数据已经被删除而且找不到最新数据,就终止操作。 对于数据跨分区结果,第一个操作执行完后,第二个操作会报错。 如果第一个操作是update,由于新数据在新分区中,第二个操作不能成功找到最新的数据,就无法操作,之后会报错。 如果第一个操作是delete,第二个操作看到当前数据已经被删除而且找不到最新数据,但无法判断删除旧数据的操作是update还是delete。如果是update,报错处理。如果是delete,终止操作。为了保持数据的正确性,只能报错处理。 如果是update和update并发,update和delete并发场景,需要串行执行才能解决问题,如果是delete和delete并发,关闭行迁移开关可以解决问题。
  • 语法格式 CREATE TABLE [ IF NOT EXISTS ] partition_table_name ( [ { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option [...] ] }[, ... ] ] ) [ WITH ( {storage_parameter = value} [, ... ] ) ] [ COMPRESS | NOCOMPRESS ] [ TABLESPACE tablespace_name ] PARTITION BY { {RANGE (partition_key) [ INTERVAL ('interval_expr') [ STORE IN (tablespace_name [, ... ] ) ] ] ( partition_less_than_item [, ... ] )} | {RANGE (partition_key) [ INTERVAL ('interval_expr') [ STORE IN (tablespace_name [, ... ] ) ] ] ( partition_start_end_item [, ... ] )} | {LIST (partition_key) ( PARTITION partition_name VALUES (list_values) [TABLESPACE tablespace_name][, ... ])} | {HASH (partition_key) ( PARTITION partition_name [TABLESPACE tablespace_name][, ... ])} } [ { ENABLE | DISABLE } ROW MOVEMENT ]; 列约束column_constraint: [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) | DEFAULT default_e xpr | GENERATED ALWAYS AS ( generation_expr ) STORED | UNIQUE index_parameters | PRIMARY KEY index_parameters | REFEREN CES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 表约束table_constraint: [ CONSTRAINT constraint_name ] { CHECK ( expression ) | UNIQUE ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters | FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] like选项like_option: { INCLUDING | EXCLUDING } { DEFAULTS | GENERATED | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | RELOPTIONS| ALL } 索引存储参数index_parameters: [ WITH ( {storage_parameter = value} [, ... ] ) ] [ USING INDEX TABLESPACE tablespace_name ]
  • 功能描述 创建分区表。分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储,这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。 常见的分区方案有范围分区(Range Partitioning)、间隔分区(Interval Partitioning)、哈希分区(Hash Partitioning)、列表分区(List Partitioning)、数值分区(Value Partition)等。目前行存表支持范围分区、间隔分区、哈希分区、列表分区,列存表仅支持范围分区。 范围分区是根据表的一列或者多列,将要插入表的记录分为若干个范围,这些范围在不同的分区里没有重叠。为每个范围创建一个分区,用来存储相应的数据。 范围分区的分区策略是指记录插入分区的方式。目前范围分区仅支持范围分区策略。 范围分区策略:根据分区键值将记录映射到已创建的某个分区上,如果可以映射到已创建的某一分区上,则把记录插入到对应的分区上,否则给出报错和提示信息。这是最常用的分区策略。 间隔分区是一种特殊的范围分区,相比范围分区,新增间隔值定义,当插入记录找不到匹配的分区时,可以根据间隔值自动创建分区。 间隔分区只支持基于表的一列分区,并且该列只支持TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE数据类型。 间隔分区策略:根据分区键值将记录映射到已创建的某个分区上,如果可以映射到已创建的某一分区上,则把记录插入到对应的分区上,否则根据分区键值和表定义信息自动创建一个分区,然后将记录插入新分区中,新创建的分区数据范围等于间隔值。 哈希分区是根据表的一列,为每个分区指定模数和余数,将要插入表的记录划分到对应的分区中,每个分区所持有的行都需要满足条件:分区键的值除以为其指定的模数将产生为其指定的余数。 哈希分区策略:根据分区键值将记录映射到已创建的某个分区上,如果可以映射到已创建的某一分区上,则把记录插入到对应的分区上,否则返回报错和提示信息。 列表分区是根据表的一列,将要插入表的记录通过每一个分区中出现的键值划分到对应的分区中,这些键值在不同的分区里没有重叠。为每组键值创建一个分区,用来存储相应的数据。 列表分区策略:根据分区键值将记录映射到已创建的某个分区上,如果可以映射到已创建的某一分区上,则把记录插入到对应的分区上,否则给出报错和提示信息。 分区可以提供若干好处: 某些类型的查询性能可以得到极大提升。特别是表中访问率较高的行位于一个单独分区或少数几个分区上的情况下。分区可以减少数据的搜索空间,提高数据访问效率。 当查询或更新一个分区的大部分记录时,连续扫描那个分区而不是访问整个表可以获得巨大的性能提升。 如果需要大量加载或者删除的记录位于单独的分区上,则可以通过直接读取或删除那个分区以获得巨大的性能提升,同时还可以避免由于大量DELETE导致的VACUUM超载(哈希分区不支持删除分区)。
  • 参数 表1 SQLFreeHandle参数 关键字 参数说明 HandleType SQLFreeHandle要释放的句柄类型。必须为下列值之一: SQL_HANDLE_ENV SQL_HANDLE_DBC SQL_HANDLE_STMT SQL_HANDLE_DESC 如果HandleType不是这些值之一,SQLFreeHandle返回SQL_INVALID_HANDLE。 Handle 要释放的句柄。
  • 使用gsql元命令导入数据 \copy命令在任何psql客户端登录数据库成功后可以执行导入数据。与COPY命令相比较,\copy命令不是读取或写入指定文件的服务器,而是直接读取或写入文件。 这个操作不如COPY命令有效,因为所有的数据必须通过客户端/服务器的连接来传递。对于大量的数据来说COPY命令可能会更好。 有关如何使用\copy命令的更多信息,请参阅使用gsql元命令导入数据。 \COPY只适合小批量,格式良好的数据导入,不会对非法字符做预处理,也无容错能力,无法适用于含有异常数据的场景。导入数据应优先选择COPY。
  • 使用INSERT多行插入 插入如果不能使用copy命令,而您需要进行sql插入,可以根据情况使用多行插入。如果您使用的是列存表,一次只插入一行或几行,则数据压缩效率低下。 多行插入是通过批量进行一系列插入而提高性能。下面的示例使用一条insert语句向一个三列表插入三行。这仍属于少量插入,只是用来说明多行插入的语法。创建表的步骤请参考3.6-创建和管理表。 向表customer_t1中插入多行数据: openGauss=# insert into customer_t1 values (68, 'a1', 'zhou','wang'), (43, 'b1', 'wu', 'zhao'), (95, 'c1', 'zheng', 'qian'); 有关更多详情和示例,请参阅INSERT。
  • 使用INSERT批量插入 带SELECT子句使用批量插入操作来实现高性能数据插入。 如果需要将数据或数据子集从一个表移动到另一个表,可以使用INSERT和CREATE TABLE AS命令。 如果从指定表插入数据到当前表,例如在数据库中创建了一个表customer_t1的备份表customer_t2,现在需要将表customer_t1中的数据插入到表customer_t2中,则可以执行如下命令。 1 2 3 4 5 6 7 8 openGauss=# CREATE TABLE customer_t2 ( c_customer_sk integer, c_customer_id char(5), c_first_name char(6), c_last_name char(8) ); openGauss=# INSERT INTO customer_t2 SELECT * FROM customer_t1; 上面的示例等价于: 1 openGauss=# CREATE TABLE customer_t2 AS SELECT * FROM customer_t1;
  • 参数 表1 SQLSetConnectAttr参数 关键字 参数说明 ConnectionHandle 连接句柄。 Attribute 设置属性。 ValuePtr 指向对应Attribute的值。依赖于Attribute的值,ValuePtr是32位无符号整型值或指向以空结束的字符串。注意,如果ValuePtr参数是驱动程序指定值。ValuePtr可能是有符号的整数。 StringLength 如果ValuePtr指向字符串或二进制缓冲区,这个参数是*ValuePtr长度,如果ValuePtr指向整型,忽略StringLength。
  • 原型 1 2 3 4 SQLRETURN SQLSetConnectAttr(SQLHDBC ConnectionHandle SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
  • 选择分区方案 当表中的数据量很大时,应当对表进行分区,一般需要遵循以下原则: 【建议】使用具有明显区间性的字段进行分区,比如日期、区域等字段上建立分区。 【建议】分区名称应当体现分区的数据特征。例如,关键字+区间特征。 【建议】将分区上边界的分区值定义为MAXVALUE,以防止可能出现的数据溢出。 表2 表的分区方式及使用场景 分区方式 描述 Range 表数据通过范围进行分区。 Interval 表数据通过范围进行分区,超出范围的会自动根据间隔创建新的分区。 List 表数据通过指定列按照具体值进行分区。 Hash 表数据通过Hash散列方式进行分区。 典型的分区表定义如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 --创建Range分区表 CREATE TABLE staffS_p1 ( staff_ID NUMBER(6) not null, FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25), EMAIL VARCHAR2(25), PHONE_NUMBER VARCHAR2(20), HIRE_DATE DATE, employment_ID VARCHAR2(10), SALARY NUMBER(8,2), COMMISSION_PCT NUMBER(4,2), MANAGER_ID NUMBER(6), section_ID NUMBER(4) ) PARTITION BY RANGE (HIRE_DATE) ( PARTITION HIRE_19950501 VALUES LESS THAN ('1995-05-01 00:00:00'), PARTITION HIRE_19950502 VALUES LESS THAN ('1995-05-02 00:00:00'), PARTITION HIRE_maxvalue VALUES LESS THAN (MAXVALUE) ); --创建Interval分区表,初始两个分区,插入分区范围外的数据会自动新增分区 CREATE TABLE sales (prod_id NUMBER(6), cust_id NUMBER, time_id DATE, channel_id CHAR(1), promo_id NUMBER(6), quantity_sold NUMBER(3), amount_sold NUMBER(10,2) ) PARTITION BY RANGE (time_id) INTERVAL('1 day') ( PARTITION p1 VALUES LESS THAN ('2019-02-01 00:00:00'), PARTITION p2 VALUES LESS THAN ('2019-02-02 00:00:00') ); --创建List分区表 CREATE TABLE test_list (col1 int, col2 int) partition by list(col1) ( partition p1 values (2000), partition p2 values (3000), partition p3 values (4000), partition p4 values (5000) ); --创建Hash分区表 CREATE TABLE test_hash (col1 int, col2 int) partition by hash(col1) ( partition p1, partition p2 ); 更多的表分区语法信息参见CREATE TABLE PARTITION。
  • 背景信息 当用户对数据库中的一张或者多张表的某些字段的组合感兴趣,而又不想每次键入这些查询时,用户就可以定义一个视图,以便解决这个问题。 视图与基本表不同,不是物理上实际存在的,是一个虚表。数据库中仅存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。若基本表中的数据发生变化,从视图中查询出的数据也随之改变。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中用户感兴趣的数据及变化。视图每次被引用的时候都会运行一次。
  • 二进制字符串函数 GaussDB也提供了函数调用所使用的常用语法。 btrim(string bytea,bytes bytea) 描述:从string的开头和结尾删除只包含bytes中字节的最长的字符串。 返回值类型:bytea 示例: 1 2 3 4 5 openGauss=# SELECT btrim(E'\\000trim\\000'::bytea, E'\\000'::bytea) AS RESULT; result ------------ \x7472696d (1 row) get_bit(string, offset) 描述:从字符串中抽取位。 返回值类型:int 示例: 1 2 3 4 5 openGauss=# SELECT get_bit(E'Th\\000omas'::bytea, 45) AS RESULT; result -------- 1 (1 row) get_byte(string, offset) 描述:从字符串中抽取字节。 返回值类型:int 示例: 1 2 3 4 5 openGauss=# SELECT get_byte(E'Th\\000omas'::bytea, 4) AS RESULT; result -------- 109 (1 row) rawcmp 描述:raw数据类型比较函数。 参数:raw, raw 返回值类型:integer raweq 描述:raw数据类型比较函数。 参数:raw, raw 返回值类型:boolean rawge 描述:raw数据类型比较函数。 参数:raw, raw 返回值类型:boolean rawgt 描述:raw数据类型比较函数。 参数:raw, raw 返回值类型:boolean rawin 描述:raw数据类型解析函数。 参数:cstring 返回值类型:bytea rawle 描述:raw数据类型解析函数。 参数:raw, raw 返回值类型:boolean rawlike 描述:raw数据类型解析函数。 参数:raw, raw 返回值类型:boolean rawlt 描述:raw数据类型解析函数。 参数:raw, raw 返回值类型:boolean rawne 描述:比较raw类型是否一样。 参数:raw, raw 返回值类型:boolean rawnlike 描述:比较raw类型与模式是否不匹配。 参数:raw, raw 返回值类型:boolean rawout 描述:RAW类型的输出接口。 参数:bytea 返回值类型:cstring rawsend 描述:转换bytea为二进制类型。 参数:raw 返回值类型:bytea rawtohex 描述:raw格式转换为十六进制。 参数:text 返回值类型:text set_bit(string,offset, newvalue) 描述:设置字符串中的位。 返回值类型:bytea 示例: 1 2 3 4 5 openGauss=# SELECT set_bit(E'Th\\000omas'::bytea, 45, 0) AS RESULT; result ------------------ \x5468006f6d4173 (1 row) set_byte(string,offset, newvalue) 描述:设置字符串中的字节。 返回值类型:bytea 示例: 1 2 3 4 5 openGauss=# SELECT set_byte(E'Th\\000omas'::bytea, 4, 64) AS RESULT; result ------------------ \x5468006f406173 (1 row)
  • 字符串操作符 SQL定义了一些字符串函数,在这些函数里使用关键字而不是逗号来分隔参数。 octet_length(string) 描述:二进制字符串中的字节数。 返回值类型:int 示例: 1 2 3 4 5 openGauss=# SELECT octet_length(E'jo\\000se'::bytea) AS RESULT; result -------- 5 (1 row) overlay(string placing string from int [for int]) 描述:替换子串。 返回值类型:bytea 示例: 1 2 3 4 5 openGauss=# SELECT overlay(E'Th\\000omas'::bytea placing E'\\002\\003'::bytea from 2 for 3) AS RESULT; result ---------------- \x5402036d6173 (1 row) position(substring in string) 描述:特定子字符串的位置。 返回值类型:int 示例: 1 2 3 4 5 openGauss=# SELECT position(E'\\000om'::bytea in E'Th\\000omas'::bytea) AS RESULT; result -------- 3 (1 row) substring(string [from int] [for int]) 描述:截取子串。 返回值类型:bytea 示例: 1 2 3 4 5 openGauss=# SELECT substring(E'Th\\000omas'::bytea from 2 for 3) AS RESULT; result ---------- \x68006f (1 row) substr(string, from int [, for int]) 描述:截取子串。 返回值类型:bytea 示例: 1 2 3 4 5 openGauss=# select substr(E'Th\\000omas'::bytea,2, 3) as result; result ---------- \x68006f (1 row) trim([both] bytes from string) 描述:从string的开头和结尾删除只包含bytes中字节的最长字符串。 返回值类型:bytea 示例: 1 2 3 4 5 openGauss=# SELECT trim(E'\\000'::bytea from E'\\000Tom\\000'::bytea) AS RESULT; result ---------- \x546f6d (1 row)
  • 参数说明 GRANT的权限分类如下所示。 SELECT 允许对指定的表、视图、序列执行SELECT命令,update或delete时也需要对应字段上的select权限。 INSERT 允许对指定的表执行INSERT命令。 UPDATE 允许对声明的表中任意字段执行UPDATE命令。通常,update命令也需要select权限来查询出哪些行需要更新。SELECT… FOR UPDATE和SELECT… FOR SHARE除了需要SELECT权限外,还需要UPDATE权限。 DELETE 允许执行DELETE命令删除指定表中的数据。通常,delete命令也需要select权限来查询出哪些行需要删除。 TRUNCATE 允许执行TRUNCATE语句删除指定表中的所有记录。 REFERENCES 创建一个外键约束,必须拥有参考表和被参考表的REFERENCES权限。 CREATE 对于数据库,允许在数据库里创建新的模式。 对于模式,允许在模式中创建新的对象。如果要重命名一个对象,用户除了必须是该对象的所有者外,还必须拥有该对象所在模式的CREATE权限。 对于表空间,允许在表空间中创建表,允许在创建数据库和模式的时候把该表空间指定为缺省表空间。 CONNECT 允许用户连接到指定的数据库。 EXECUTE 允许使用指定的函数,以及利用这些函数实现的操作符。 USAGE 对于过程语言,允许用户在创建函数的时候指定过程语言。 对于模式,USAGE允许访问包含在指定模式中的对象,若没有该权限,则只能看到这些对象的名称。 对于序列,USAGE允许使用nextval函数。 对于Data Source对象,USAGE是指访问权限,也是可赋予的所有权限,即USAGE与ALL PRIVILEGES等价。 ALTER 允许用户修改指定对象的属性,但不包括修改对象的所有者和修改对象所在的模式。 DROP 允许用户删除指定的对象。 COMMENT 允许用户定义或修改指定对象的注释。 INDEX 允许用户在指定表上创建索引,并管理指定表上的索引,还允许用户对指定表执行REINDEX和CLUSTER操作。 VACUUM 允许用户对指定的表执行ANALYZE和VACUUM操作。 ALL PRIVILEGES 一次性给指定用户/角色赋予所有可赋予的权限。只有系统管理员有权执行GRANT ALL PRIVILEGES。 GRANT的参数说明如下所示。 role_name 已存在用户名称。 table_name 已存在表名称。 column_name 已存在字段名称。 schema_name 已存在模式名称。 database_name 已存在数据库名称。 function_name 已存在函数名称。 procedure_name 已存在存储过程名称。 sequence_name 已存在序列名称。 domain_name 已存在域类型名称。 fdw_name 已存在外部数据包名称。 lang_name 已存在语言名称。 type_name 已存在类型名称。 src_name 已存在的Data Source对象名称。 argmode 参数模式。 取值范围:字符串,要符合标识符命名规范。 arg_name 参数名称。 取值范围:字符串,要符合标识符命名规范。 arg_type 参数类型。 取值范围:字符串,要符合标识符命名规范。 loid 包含本页的大对象的标识符。 取值范围:字符串,要符合标识符命名规范。 tablespace_name 表空间名称。 client_master_key 客户端加密主密钥的名称。 取值范围:字符串,要符合标识符命名规范。 column_encryption_key 列加密密钥的名称。 取值范围:字符串,要符合标识符命名规范。 directory_name 目录名称。 取值范围:字符串,要符合标识符命名规范。 WITH GRANT OPTION 如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC。 非对象所有者给其他用户授予对象权限时,命令按照以下规则执行: 如果用户没有该对象上指定的权限,命令立即失败。 如果用户有该对象上的部分权限,则GRANT命令只授予他有授权选项的权限。 如果用户没有可用的授权选项,GRANT ALL PRIVILEGES形式将发出一个警告信息,其他命令形式将发出在命令中提到的且没有授权选项的相关警告信息。 数据库系统管理员可以访问所有对象,而不会受对象的权限设置影响。这个特点类似Unix系统的root的权限。和root一样,除了必要的情况外,建议不要总是以系统管理员身份进行操作。
  • 注意事项 不允许将ANY权限授予PUBLIC,也不允许从PUBLIC回收ANY权限。 ANY权限属于数据库内的权限,只对授予该权限的数据库内的对象有效,例如SELECT ANY TABLE只允许用户查看当前数据库内的所有用户表数据,对其他数据库内的用户表无查看权限。 即使用户被授予ANY权限,也不能对私有用户下的对象进行访问操作(INSERT、DELETE、UPDATE、SELECT)。 ANY权限与原有的权限相互无影响。 如果用户被授予CREATE ANY TABLE权限,在同名schema下创建表的属主是该schema的创建者,用户对表进行其他操作时,需要授予相应的操作权限。 需要谨慎授予用户CREATE ANY FUNMCTION的权限,以免其他用户利用SECURITY DEFINER类型的函数进行权限提升。
  • 语法格式 将表或视图的访问权限赋予指定的用户或角色。 GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将表中字段的访问权限赋予指定的用户或角色。 GRANT { {{ SELECT | INSERT | UPDATE | REFERENCES | COMMENT } ( column_name [, ...] )} [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) } ON [ TABLE ] table_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将序列的访问权限赋予指定的用户或角色,LARGE字段属性可选,赋权语句不区分序列是否为LARGE。 GRANT { { SELECT | UPDATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON { [ [ LARGE ] SEQUENCE ] sequence_name [, ...] | ALL SEQUENCES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将数据库的访问权限赋予指定的用户或角色。 GRANT { { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE database_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将域的访问权限赋予指定的用户或角色。 GRANT { USAGE | ALL [ PRIVILEGES ] } ON DOMAIN domain_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 本版本暂时不支持赋予域的访问权限。 将客户端加密主密钥CMK的访问权限赋予指定的用户或角色。 1 2 3 4 GRANT { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] } ON CLIENT_MASTER_KEY client_master_key [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将列加密密钥CEK的访问权限赋予指定的用户或角色。 1 2 3 4 GRANT { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] } ON COLUMN_ENCRYPTION_KEY column_encryption_key [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将外部数据源的访问权限赋予给指定的用户或角色。 GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPER fdw_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将外部服务器的访问权限赋予给指定的用户或角色。 GRANT { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON FOREIGN SERVER server_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将函数的访问权限赋予给指定的用户或角色。 GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将存储过程的访问权限赋予给指定的用户或角色。 1 2 3 4 GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON { PROCEDURE {proc_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将过程语言的访问权限赋予给指定的用户或角色。 GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE lang_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将大对象的访问权限赋予指定的用户或角色。 GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECT loid [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 本版本暂时不支持大对象。 将模式的访问权限赋予指定的用户或角色。 GRANT { { CREATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA schema_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将模式中的表或者视图对象授权给其他用户时,需要将表或视图所属的模式的USAGE权限同时授予该用户,若没有该权限,则只能看到这些对象的名称,并不能实际进行对象访问。 同名模式下创建表的权限无法通过此语法赋予,可以通过将角色的权限赋予其他用户或角色的语法,赋予同名模式下创建表的权限。 将表空间的访问权限赋予指定的用户或角色。 GRANT { { CREATE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON TABLESPACE tablespace_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将类型的访问权限赋予指定的用户或角色。 GRANT { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON TYPE type_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 本版本暂时不支持赋予类型的访问权限。 将Data Source对象的权限赋予指定的角色。 1 2 3 4 GRANT { USAGE | ALL [PRIVILEGES]} ON DATA SOURCE src_name [, ...] TO { [GROUP] role_name | PUBLIC } [, ...] [WITH GRANT OPTION]; 将directory对象的权限赋予指定的角色。 1 2 3 4 GRANT { { READ | WRITE | ALTER | DROP } [, ...] | ALL [PRIVILEGES] } ON DIRECTORY directory_name [, ...] TO { [GROUP] role_name | PUBLIC } [, ...] [WITH GRANT OPTION]; 将package对象的权限赋予指定的角色。 1 2 3 4 5 GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [PRIVILEGES] } ON { PACKAGE package_name [, ...] | ALL PACKAGES IN SCHEMA schema_name [, ...] } TO { [GROUP] role_name | PUBLIC } [, ...] [WITH GRANT OPTION]; 将角色的权限赋予其他用户或角色的语法。 GRANT role_name [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ]; 将sysadmin权限赋予指定的角色。 GRANT ALL { PRIVILEGES | PRIVILEGE } TO role_name;
  • 功能描述 对角色和用户进行授权操作。 使用GRANT命令进行用户授权包括以下场景: 将系统权限授权给角色或用户 系统权限又称为用户属性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN、MONADMIN、OPRADMIN、POLADMIN、INHERIT、REPLICATION、VCADMIN和LOGIN等。 系统权限一般通过CREATE/ALTER ROLE语法来指定。其中,SYSADMIN权限可以通过GRANT/REVOKE ALL PRIVILEGE授予或撤销。但系统权限无法通过ROLE和USER的权限被继承,也无法授予PUBLIC。 将数据库对象授权给角色或用户 将数据库对象(表和视图、指定字段、数据库、函数、模式、表空间等)的相关权限授予特定角色或用户; GRANT命令将数据库对象的特定权限授予一个或多个角色。这些权限会追加到已有的权限上。 关键字PUBLIC表示该权限要赋予所有角色,包括以后创建的用户。PUBLIC可以看做是一个隐含定义好的组,它总是包括所有角色。任何角色或用户都将拥有通过GRANT直接赋予的权限和所属的权限,再加上PUBLIC的权限。 如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC,这是GaussDB特有的属性。 GaussDB会将某些类型的对象上的权限授予PUBLIC。默认情况下,对表、表字段、序列、外部数据源、外部服务器、模式或表空间对象的权限不会授予PUBLIC,而以下这些对象的权限会授予PUBLIC:数据库的CONNECT权限和CREATE TEMP TABLE权限、函数的EXECUTE特权、语言和数据类型(包括域)的USAGE特权。当然,对象拥有者可以撤销默认授予PUBLIC的权限并专门授予权限给其他用户。为了更安全,建议在同一个事务中创建对象并设置权限,这样其他用户就没有时间窗口使用该对象。另外可参考安全加固指南的权限控制章节,对PUBLIC用户组的权限进行限制。这些初始的默认权限可以使用ALTER DEFAULT PRIVILEGES命令修改。 对象的所有者缺省具有该对象上的所有权限,出于安全考虑所有者可以舍弃部分权限,但ALTER、DROP、COMMENT、INDEX、VACUUM以及对象的可再授予权限属于所有者固有的权限,隐式拥有。 将角色或用户的权限授权给其他角色或用户 将一个角色或用户的权限授予一个或多个其他角色或用户。在这种情况下,每个角色或用户都可视为拥有一个或多个数据库权限的集合。 当声明了WITH ADMIN OPTION,被授权的用户可以将该权限再次授予其他角色或用户,以及撤销所有由该角色或用户继承到的权限。当授权的角色或用户发生变更或被撤销时,所有继承该角色或用户权限的用户拥有的权限都会随之发生变更。 数据库系统管理员可以给任何角色或用户授予/撤销任何权限。拥有CREATEROLE权限的角色可以赋予或者撤销任何非系统管理员角色的权限。 将ANY权限授予给角色或用户 将ANY权限授予特定的角色和用户,ANY权限的取值范围参见语法格式。当声明了WITH ADMIN OPTION,被授权的用户可以将该ANY权限再次授予其他角色/用户,或从其他角色/用户处回收该ANY权限。ANY权限可以通过角色被继承,但不能赋予PUBLIC。初始用户和三权分立关闭时的系统管理员用户可以给任何角色/用户授予或撤销ANY权限。 目前支持以下ANY权限:CREATE ANY TABLE、ALTER ANY TABLE、DROP ANY TABLE、SELECT ANY TABLE、INSERT ANY TABLE、UPDATE ANY TABLE、DELETE ANY TABLE、CREATE ANY SEQUENCE、CREATE ANY INDEX、CREATE ANY FUNCTION、EXECUTE ANY FUNCTION、 CREATE ANY PACKAGE、EXECUTE ANY PACKAGE、CREATE ANY TYPE。详细的ANY权限范围描述参考表1
  • 参数 表1 SQLBindParameter 关键词 参数说明 StatementHandle 语句句柄。 ParameterNumber 参数序号,起始为1,依次递增。 InputOutputType 输入输出参数类型。 ValueType 参数的C数据类型。 ParameterType 参数的SQL数据类型。 ColumnSize 列的大小或相应参数标记的表达式。 DecimalDigits 列的十进制数字或相应参数标记的表达式。 ParameterValuePtr 指向存储参数数据缓冲区的指针。 BufferLength ParameterValuePtr指向缓冲区的长度,以字节为单位。 StrLen_or_IndPtr 缓冲区的长度或指示器指针。若为空值,则未使用任何长度或指示器值。
共100000条