
# 使用rds_hwdrs_privs插件
#### 简介
rds_hwdrs_privs插件用来给未root提权的RDS for PostgreSQL版本做部分的权限提升，包括：
- 对pg_catalog.pg_authid的select权限
- 对用户赋予bypassrls,replication的权限
- 创建对all tables的发布
- 执行部分pg_replication_origin_xxx函数的权限
 
#### 支持的版本说明
该插件的目的是给未root提权版本（9.5, 9.6, 10, 11.5及之前的版本）提升权限的，建议11.5之后的版本直接使用root用户进行此插件执行的赋权动作。
可通过以下SQL语句查询当前实例是否支持该插件：
```
SELECT * FROM pg_available_extension_versions WHERE name = 'rds_hwdrs_privs';
```
RDS for PostgreSQL实例支持的插件，具体请参见[支持的插件列表](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0045.html)。
#### 插件安装与卸载
- 安装插件
  ```
  SELECT control_extension ('create', 'rds_hwdrs_privs');
  ```
  
- 卸载插件
  ```
  SELECT control_extension ('drop', 'rds_hwdrs_privs');
  ```
  
更多信息，请参见[通过界面安装和卸载插件](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0070.html)和[通过SQL命令安装和卸载插件](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0043.html)。
#### 基本使用
此插件只能由root用户或者root的成员用户执行。
可以通过root用户直接执行，或者通过如下操作：
```
grant root to drs_sync;
```
将root权限赋予drs_sync，这样drs_sync用户也能够执行。
- 赋予某个用户对pg_catalog.pg_authid的select权限。
  ```
  select control_select_on_pg_authid('grant', 'drs_sync');
  ```
  其中，第一个参数可以选择grant, revoke；第二个参数是具体的用户，用户必须已存在。
  

- 对用户赋予bypassrls, replication的权限。 select control_user_privilege('bypassrls', 'drs_sync');
  其中，第一个参数是要赋予的权限，可选范围是bypassrls, nobypassrls, replication, noreplication；第二个参数是具体的用户，用户必须已存在。
  
- 创建对all tables的发布。
  ```
  select create_publication_for_all_tables('foo_pub', 'insert, update');
  select create_publication_for_all_tables('foo_pub');
  ```
  ![](https://support.huaweicloud.com/usermanual-rds-pg/public_sys-resources/note_3.0-zh-cn.png)
  该函数只创建for all tables的发布，对于某个表的发布可以使用正常的SQL。
  其中，第一个参数是发布名，不能和已有的发布重名；第二个参数是选项，可以缺省，缺省情况下和create publication foo_pub for all tables一样；不缺省的情况下，在RDS for PostgreSQL 10版本中可选的是insert, update, delete，在11版本中可选项多了truncate。
  创建出来的publication的owner是root。可以使用root用户或者root的成员用户，通过SQL对该publication进行接下来的操作。
  
- 执行部分pg_replication_origin_xxx函数。
  ```
  -- 创建一个复制源
  select exec_pg_replication_origin_func('pg_replication_origin_create', 'foo_repl_origin');
  -- 删除这个复制源
  select exec_pg_replication_origin_func('pg_replication_origin_create', 'foo_repl_origin');
  -- 查看当前会话是否绑定了复制源
  select exec_pg_replication_origin_func('pg_replication_origin_session_is_setup');
  ```
  其中，第一个参数是要执行的函数名，可选范围是'pg_replication_origin_create', 'pg_replication_origin_drop', 'pg_replication_origin_oid', 'pg_replication_origin_session_setup', 'pg_replication_origin_session_reset', 'pg_replication_origin_session_is_setup'；第二个参数是可以缺省的，是否缺省取决于要执行的函数是否需要参数值。
  
 
