
# 安全函数
#### gs_password_deadline()
描述：显示当前账户距离密码过期的时间。密码过期后提示用户修改密码。与GUC参数password_effect_time相关。
返回值类型：interval
示例：
```
SELECT gs_password_deadline();
  gs_password_deadline   
-------------------------
 83 days 17:44:32.196094
(1 row)
```
#### gs_password_expiration()
描述：显示当前账户距离密码过期的时间。密码过期后用户无法登录数据库。与创建用户的DDL语句PASSWORD EXPIRATION period相关，函数返回值大于等于-1，如果创建用户时未指定PASSWORD EXPIRATION period，该函数的缺省值为-1，表示没有过期限制。
返回值类型：interval
示例：
```
SELECT gs_password_expiration();
  gs_password_expiration   
-------------------------
 29 days 23:59:49.731482
(1 row)
```
#### login_audit_messages(flag boolean)
描述：查看登录用户的登录信息。
返回值类型：元组
示例：
- 查看上一次登录认证通过的日期、时间和IP等信息：
  ```
  SELECT * FROM login_audit_messages(true);
    username  | database |       logintime        |     type      | result |  client_conninfo   |                session_id
  ------------+----------+------------------------+---------------+--------+--------------------+-----------------------------------------
       dbadmin    | gaussdb | 2017-06-02 15:28:34+08 | login_success | ok     | gsql@[local]    | 1663745305.140192538154752.coordinator1
  (1 row)
  ```
  
- 查看上一次登录认证失败的日期、时间和IP等信息：
  ```
  SELECT * FROM login_audit_messages(false) ORDER BY logintime desc limit 1;
    username  | database |       logintime        |     type     | result |     client_conninfo     | session_id
  ------------+----------+------------------------+--------------+--------+-------------------------+------------
  (0 rows)
  ```
  
- 查看自从最后一次认证通过以来失败的尝试次数、日期和时间：
  ```
  SELECT * FROM login_audit_messages(false);
    username  | database |       logintime        |     type     | result |     client_conninfo     | session_id
  ------------+----------+------------------------+--------------+--------+-------------------------+------------
  (0 rows)
  ```
  
 
#### login_audit_messages_pid(flag boolean)
描述：查看登录用户的登录信息。与login_audit_messages的区别在于结果基于当前backendid向前查找。所以不会因为同一用户的后续登录，而影响本次登录的查询结果。也就是查询不到该用户后续登录的信息。
返回值类型：元组
示例：
- 查看上一次登录认证通过的日期、时间和IP等信息：
  ```
  SELECT * FROM login_audit_messages_pid(true);
    username  | database |       logintime        |     type      | result |  client_conninfo | backendid   |               session_id
  ------------+----------+------------------------+---------------+--------+--------------------+-----------------------------------------
       dbadmin    | postgres | 2017-06-02 15:28:34+08 | login_success | ok     | gsql@[local] | 140311900702464 | 1663745305.140192538154752.coordinator1
  (1 row)
  ```
  
- 查看上一次登录认证失败的日期、时间和IP等信息：
  ```
  SELECT * FROM login_audit_messages_pid(false) ORDER BY logintime desc limit 1;
    username  | database |       logintime        |     type     | result |     client_conninfo   | backendid | session_id
  ------------+----------+------------------------+--------------+--------+-------------------------+------------
  (0 rows)
  ```
  
- 查看自从最后一次认证通过以来失败的尝试次数、日期和时间：
  ```
  SELECT * FROM login_audit_messages_pid(false);
    username  | database |       logintime        |     type     | result |     client_conninfo    | backendid | session_id
  ------------+----------+------------------------+--------------+--------+-------------------------+------------
  (0 rows)
  ```
  
 
#### pg_query_audit()
描述：查看当前CN节点审计日志。
返回值类型：record
函数返回字段如下：
表1pg_query_audit()函数返回字段 
| 名称              | 类型                       | 描述                                                                 |
|:---|:---|:---|
| begintime       | timestamp with time zone | 操作的执行开始时间。                                                         |
| endtime         | timestamp with time zone | 操作的执行结束时间。                                                         |
| operation_type  | text                     | 操作类型，具体类型见[表2]。  |
| audit_type      | text                     | 审计类型，具体类型见[表3]。 |
| result          | text                     | 操作结果。                                                              |
| username        | text                     | 执行操作的用户名。                                                          |
| database        | text                     | 数据库名称。                                                             |
| client_conninfo | text                     | 客户端连接信息，即gsql，jdbc或odbc。                                           |
| object_name     | text                     | 操作对象名称。                                                            |
| object_details  | text                     | 记录语句中涉及的列及其使用类型。                                                   |
| command_text    | text                     | 操作的执行命令。                                                           |
| detail_info     | text                     | 执行操作详细信息。                                                          |
| transaction_xid | text                     | 事务ID。                                                              |
| query_id        | text                     | 查询ID。                                                              |
| node_name       | text                     | 节点名称。                                                              |
| session_id      | text                     | 会话ID。                                                              |
| local_port      | text                     | 本地端口。                                                              |
| remote_port     | text                     | 远端端口。                                                              |
| result_rows     | text                     | 语句执行返回的记录数。                                                        |
| error_code      | text                     | 语句执行错误时的错误码。                                                       |
   
 表2operation_type操作类型项 
| 操作类型            | 描述                                                                                                                                                                                                   |
|:---|:---|
| audit_switch    | 表示对用户打开和关闭审计日志操作场景进行审计。                                                                                                                                                                              |
| login_logout    | 表示对用户登录和登出操作场景进行审计。                                                                                                                                                                                  |
| system          | 表示对系统的启停、实例切换操作场景进行审计。                                                                                                                                                                               |
| sql_parse       | 表示对SQL语句解析场景进行审计。                                                                                                                                                                                    |
| user_lock       | 表示对用户锁定和解锁操作的场景进行审计。                                                                                                                                                                                 |
| grant_revoke    | 表示对用户权限授予和回收操作场景进行审计。                                                                                                                                                                                |
| violation       | 表示对用户访问存在越权的场景进行审计。                                                                                                                                                                                  |
| ddl             | 表示对DDL操作场景进行审计，因为DDL操作会根据操作对象进行更细粒度控制，仍然沿用审计开关audit_system_object，即由audit_system_object控制对哪些对象的DDL操作进行审计（此处不配置ddl，只要配置了audit_system_object，审计也会生效）。                                                  |
| dml             | 表示对DML操作场景进行审计。                                                                                                                                                                                      |
| select          | 表示对SELECT操作场景进行审计。                                                                                                                                                                                   |
| internal_event  | 表示对内部事件操作场景进行审计。                                                                                                                                                                                     |
| user_func       | 表示对用户自定义函数、存储过程、匿名块操作场景进行审计。 说明： 如果自定义函数、存储过程中有fetch语句，则审计fetch语句时，其中common_text字段记录的为其对应的CURSOR内容。 |
| special_func    | 表示对特殊函数调用操作场景进行审计，特殊函数包括：pg_terminate_backend和pg_cancel_backend。                                                                                                                                     |
| copy            | 表示对COPY操作场景进行审计。                                                                                                                                                                                     |
| set             | 表示对SET操作场景进行审计。                                                                                                                                                                                      |
| transaction     | 表示对事务操作场景进行审计。                                                                                                                                                                                       |
| vacuum          | 表示对VACUUM操作场景进行审计。                                                                                                                                                                                   |
| analyze         | 表示对ANALYZE操作场景进行审计。                                                                                                                                                                                  |
| cursor          | 表示对游标操作的场景进行审计。                                                                                                                                                                                      |
| anonymous_block | 表示对匿名块操作场景进行审计。                                                                                                                                                                                      |
| explain         | 表示对EXPLAIN操作场景进行审计。                                                                                                                                                                                  |
| show            | 表示对SHOW操作场景进行审计。                                                                                                                                                                                     |
| lock_table      | 表示对锁表操作场景进行审计。                                                                                                                                                                                       |
| comment         | 表示对COMMENT操作场景进行审计。                                                                                                                                                                                  |
| preparestmt     | 表示对PREPARE、EXECUTE、DEALLOCATE操作场景进行审计。                                                                                                                                                               |
| cluster         | 表示对CLUSTER操作场景进行审计。                                                                                                                                                                                  |
| constraints     | 表示对CONSTRAINTS操作场景进行审计。                                                                                                                                                                              |
| checkpoint      | 表示对CHECKPOINT操作场景进行审计。                                                                                                                                                                               |
| barrier         | 表示对BARRIER操作场景进行审计。                                                                                                                                                                                  |
| cleanconn       | 表示对CLEAN CONNECTION操作场景进行审计。                                                                                                                                                                         |
| seclabel        | 表示对安全标签操作进行审计。                                                                                                                                                                                       |
| notify          | 表示对通知操作进行审计。                                                                                                                                                                                         |
| load            | 表示对加载操作进行审计。                                                                                                                                                                                         |
| discard         | 表示对清理当前会话所有的全局临时表信息场景进行审计。                                                                                                                                                                           |
   
 表3audit_type审计类型项 
| 审计类型                                                                                                                                              | 描述                                                                                                                                                                                                                              |
|:---|:---|
| audit_open/audit_close                                                                                                                            | 表示审计类型为打开和关闭审计日志操作。                                                                                                                                                                                                             |
| user_login/user_logout                                                                                                                            | 表示审计类型为用户登录/退出成功的操作和用户。                                                                                                                                                                                                         |
| system_start/system_stop/system_recover/system_switch                                                                                             | 表示审计类型为系统的启停、实例切换操作。                                                                                                                                                                                                            |
| sql_wait/sql_parse                                                                                                                                | 表示审计类型为SQL语句解析。                                                                                                                                                                                                                 |
| lock_user/unlock_user                                                                                                                             | 表示审计类型为用户锁定和解锁成功的操作。                                                                                                                                                                                                            |
| grant_role/revoke_role                                                                                                                            | 表示审计类型为用户权限授予和回收的操作。                                                                                                                                                                                                            |
| user_violation                                                                                                                                    | 表示审计类型为用户访问存在越权的操作。                                                                                                                                                                                                             |
| ddl_数据库对象                                                                                                                                         | 表示审计类型为DDL操作，因为DDL操作由会根据操作对象进行更细粒度控制，仍然沿用审计开关audit_system_object，即由audit_system_object控制对哪些对象的DDL操作进行审计（此处不配置ddl，只要配置了audit_system_object，审计也会生效）。 例如：ddl_sequence表示审计类型为序列相关操作。 |
| dml_action_insert/dml_action_delete/dml_action_update/dml_action_merge/dml_action_select                                                          | 表示审计类型为INSERT、DELETE、UPDATE、MERGE等DML操作。                                                                                                                                                                                        |
| internal_event                                                                                                                                    | 表示审计类型为内部事件。                                                                                                                                                                                                                    |
| user_func                                                                                                                                         | 表示审计类型为用户自定义函数、存储过程、匿名块操作。 说明： 如果自定义函数、存储过程中有fetch语句，则审计fetch语句时，其中common_text字段记录的为其对应的CURSOR内容。                                   |
| special_func                                                                                                                                      | 表示审计类型为特殊函数调用操作，特殊函数包括：pg_terminate_backend和pg_cancel_backend。                                                                                                                                                                  |
| copy_to/copy_from                                                                                                                                 | 表示审计类型为COPY相关操作。                                                                                                                                                                                                                |
| set_parameter                                                                                                                                     | 表示审计类型为SET操作。                                                                                                                                                                                                                   |
| trans_begin/trans_commit/trans_prepare/trans_rollback_to/trans_release/trans_savepoint/trans_commit_prepare/trans_rollback_prepare/trans_rollback | 表示审计类型为事务相关操作。                                                                                                                                                                                                                  |
| vacuum/vacuum_full/vacuum_merge                                                                                                                   | 表示审计类型为VACUUM相关操作。                                                                                                                                                                                                              |
| analyze/analyze_verify                                                                                                                            | 表示审计类型为ANALYZE相关操作。                                                                                                                                                                                                             |
| cursor_declare/cursor_move/cursor_fetch/cursor_close                                                                                              | 表示审计类型为游标相关操作。                                                                                                                                                                                                                  |
| codeblock_execute                                                                                                                                 | 表示审计类型为匿名块。                                                                                                                                                                                                                     |
| explain                                                                                                                                           | 表示审计类型为EXPLAIN操作。                                                                                                                                                                                                               |
| show                                                                                                                                              | 表示审计类型为SHOW操作。                                                                                                                                                                                                                  |
| lock_table                                                                                                                                        | 表示审计类型为锁表操作。                                                                                                                                                                                                                    |
| comment                                                                                                                                           | 表示审计类型为COMMENT操作。                                                                                                                                                                                                               |
| prepare/execute/deallocate                                                                                                                        | 表示审计类型为PREPARE、EXECUTE或DEALLOCATE操作。                                                                                                                                                                                            |
| cluster                                                                                                                                           | 表示审计类型为CLUSTER操作。                                                                                                                                                                                                               |
| constraints                                                                                                                                       | 表示审计类型为CONSTRAINTS操作。                                                                                                                                                                                                           |
| checkpoint                                                                                                                                        | 表示审计类型为CHECKPOINT操作。                                                                                                                                                                                                            |
| barrier                                                                                                                                           | 表示审计类型为BARRIER操作。                                                                                                                                                                                                               |
| cleanconn                                                                                                                                         | 表示审计类型为CLEAN CONNECTION操作。                                                                                                                                                                                                      |
| seclabel                                                                                                                                          | 表示审计类型为安全标签操作。                                                                                                                                                                                                                  |
| notify                                                                                                                                            | 表示审计类型为通知操作。                                                                                                                                                                                                                    |
| load                                                                                                                                              | 表示审计类型为加载操作。                                                                                                                                                                                                                    |
| discard                                                                                                                                           | 表示审计类型为DISCARD操作。                                                                                                                                                                                                               |
   
#### pgxc_query_audit()
描述：查看所有CN节点审计日志。
返回值类型：record
函数返回字段同pg_query_audit函数。
#### pg_query_audit_details()
描述：查看审计日志并将审计日志中的object_name和object_details字段由json格式解析出来。该函数仅8.2.1.100及以上集群版本支持。
返回值类型：record
函数返回字段如下：
表4pg_query_audit()函数返回字段 
| 名称              | 类型                       | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
|:---|:---|:---|
| begintime       | timestamp with time zone | 操作的执行开始时间。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| endtime         | timestamp with time zone | 操作的执行结束时间。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| operation_type  | text                     | 操作类型，具体类型见[表2]。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| audit_type      | text                     | 审计类型，具体类型见[表3]。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| result          | text                     | 操作结果。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| username        | text                     | 执行操作的用户名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| database        | text                     | 数据库名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| client_conninfo | text                     | 客户端连接信息，即gsql，jdbc或odbc。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| transaction_xid | text                     | 事务ID。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| query_id        | text                     | 查询ID。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| node_name       | text                     | 节点名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| session_id      | text                     | 会话ID。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| local_port      | text                     | 本地端口。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| remote_port     | text                     | 远端端口。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| object_name     | text                     | 表名、函数名、视图名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| column_name     | text                     | 列名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| type_of_use     | text                     | 对象的使用类型： 1：仅涉及（在实际使用中，此标志位暂不存在） 2：执行过程中访问（语句中出现的列以及在解析过程中访问到的列） 4：条件中发现（条件类型语句中，不包括条件表达式及函数） 8：inner join中发现 16：outer join中发现 32：聚合节点中发现（包括distinct、group by、聚集函数） 64：full join中发现 该列数值为叠加显示的数值。 |
| use_type        | text                     | type_of_use解析出的具体类型： 1：Reference only 2：Access 4：Conditional 8：Inner join 16：Outer join 32：Sum 64：Full join                                                                                                                                       |
| command_text    | text                     | 操作的执行命令。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   
示例：
1. 查询审计语句中所有对象的列及其在语句中使用的类型：
   ```
   SET audit_object_details = on;
   SELECT object_name,object_details,result_rows,error_code,command_text FROM pg_query_audit('2023-05-12-03 8:00:00','2023-05-12 22:55:00') where command_text like '%student%';
   ```
   查询结果如下：
   ```
   object_name                           |                                      object_details                                      | result_rows | error_code |                                                                                command_text
   ------------------------------------------------------------------+------------------------------------------------------------------------------------------+-------------+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------
    student                                                          |                                                                                          | 0           |            | CREATE TABLE student(stuNo int, stuName TEXT);
    studentscore                                                     |                                                                                          | 0           |            | CREATE TABLE studentscore(stuNo int, stuscore int);
    ["public.student_view01","public.studentscore","public.student"] |                                                                                          | 0           |            | CREATE OR REPLACE VIEW student_view01 AS SELECT * FROM student t1 where t1.stuNo in (select stuNo from studentscore t2 where t1.stuNo = t2.stuNo);
    ["public.student_view01","public.student","public.studentscore"] | {"public.student":[{"stuno":"6"},{"stuname":"2"}],"public.studentscore":[{"stuno":"6"}]} | 0           |            | SELECT * FROM student_view01
   ```
   
2. 查询结果object_details中显示部分语句执行过程中，涉及到的列及其使用类型，使用json格式进行记录。
   使用pg_query_audit_details函数对object_name和object_details列进行解析：
   ```
   SELECT database,object_name,column_name,type_of_use,use_type FROM pg_query_audit_details('2021-02-03 8:00:00','2024-02-03 22:55:00','current') where command_text like '%student%';
   ```
   查询结果如下：
   ```
   database |      object_name      | column_name | type_of_use |      use_type
   ----------+-----------------------+-------------+-------------+--------------------
    gaussdb  | student               |             | 2           | Access
    gaussdb  |                       |             | 2           | Access
    gaussdb  | studentscore          |             | 2           | Access
    gaussdb  |                       |             | 2           | Access
    gaussdb  | public.student_view01 |             | 2           | Access
    gaussdb  | public.studentscore   |             | 2           | Access
    gaussdb  | public.student        |             | 2           | Access
    gaussdb  |                       |             | 2           | Access
    gaussdb  | public.student        | stuno       | 6           | Access,Conditional
    gaussdb  | public.student        | stuname     | 2           | Access
    gaussdb  | public.studentscore   | stuno       | 6           | Access,Conditional
    gaussdb  | public.student_view01 |             | 2           | Access
    gaussdb  | public.student        |             | 2           | Access
    gaussdb  | public.studentscore   |             | 2           | Access
    gaussdb  |                       |             | 2           | Access
   (15 rows)
   ```
   
 
#### pg_delete_audit()
描述：删除指定时间段的审计日志。8.1.3及以上集群版本中该函数已废弃。   
返回值类型：void
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
基于数据库安全考虑，不提供删除指定时间段的审计日志的函数接口，调用该函数将直接报"ERROR: For security purposes, it is not allowed to manually delete audit logs"。
#### create_audit_csv_foregion_table()
描述：创建读审计日志的分区外表。用户调用该函数生成审计日志外表pgxc_audit_logs，通过读取pgxc_audit_logs可以读取放在obs上的审计日志信息。该函数仅8.3.0及以上集群支持。
入参：
- obs_server：text类型，obs server名称
- file_path：text类型，obs文件路径
返回值类型：record
示例：
```
--创建obs server
CREATE SERVER obs_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS (
   address 'obs.example.xxx:xxx',
   encrypt 'true',
   access_key 'xxxxxxxxx',
   secret_access_key 'xxxxxxxxxxxxxx',
   type 'obs' );
--调用该函数生成审计日志外表
SELECT * FROM pg_catalog.create_audit_csv_foregion_table('obs_server','/obs-audit/test/');
 create_audit_csv_foregion_table
---------------------------------
 t
(1 row)
--读取放在obs上的审计日志信息
SELECT * FROM pgxc_audit_logs where year=2023 and month=7 and date=24;
 year | month | date |         begintime          |          endtime           | operation_type |    audit_type     | result | username | database | client_conninfo |          object_name           | object_details |command_text| detail_info | transaction_xid |      query_id      | node_name |             session_id             | local_port | remote_port | result_rows | error_code
------+-------+------+----------------------------+----------------------------+----------------+-------------------+--------+----------+----------+-----------------+--------------------------------+----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+-----------------+--------------------+-----------+------------------------------------+------------+-------------+-------------+------------
 2023 | 7     | 24   | 2023-07-24 09:56:40.727+08 | 2023-07-24 09:56:42.215+08 | dml            | dml_action_select | ok     | dbadmin  | gaussdb  | gsql@[local]    | public.pgxc_audit_logs         |                | select * f
rom pgxc_audit_logs where year=2023 and date=24 and month=7;
```
