Postgresql开发-添加系统表

在修改pg_proc.h 的时候,发现只要在其中编写, 就会被BKI解析 生成到Postgres.bki文件中,用于initdb重建数据库。 从而被创建;

因此想:

是否可以直接在include/catalong下添加xxx.h文件,用于创建自己定义的数据表;

步骤1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef PG_ROCKY_AUDITINFO_H_
#define PG_ROCKY_AUDITINFO_H_

#include "catalog/genbki.h"

#define TableAuditRelationId 3294

CATALOG(pg_auditinfo,3294)
{
Oid user; /* owner of tablespace */
text sql;

}FormData_pg_auditinfo;

typedef FormData_pg_auditinfo* Form_pg_auditinfo;

#define Natts_pg_auditinfo 2
#define Anum_pg_auditinfo_user 1
#define Anum_pg_auditinfo_sql 2

#endif /* PG_TABLESPACE_H */

其中Oid设置请运行 include/catalong/unused_oids 来查看未使用的Oid;

注意格式: backend/catalong/Makefile 执行时,可能存在因为格式问题报错, 注意查看是否产生报错信息

此时运行make clean; make -j2 发现,在postgre.bki 没有生成建立该表的信息。

步骤2

查看当前 postgre.bki当前目录下的Makefile即backend/catalong/Makefile发现有一个变量,用于提供BKI执行文件信息: POSTGRES_BKI_SRCS

即我们在此变量中追加我们的文件名.

再从新编译make clean & make 将会在postgres.bki发现建表信息

1
2
3
4
5
6
7
create pg_auditinfo 3294
(
user = oid ,
sql = text
)
open pg_auditinfo
close pg_auditinfo

initdb 重新建立数据库,psql 连接后执行select语句我们将发现新建表

1
2
3
4
Postgres=# select * from pg_auditinfo ;
user | sql
------+-----
(0 rows)


添加系统表声明

系统表选项: 仅用于声明;

  • BKI_BOOTSTRAP
  • BKI_ROWTYPE_OID(oid)
  • BKI_WITHOUT_OIDS
  • BKI_SCHEMA_MACRO
  • BKI_SHARED_RELATION
  • BKI_FORCE_NULL
  • BKI_FORCE_NOT_NULL


系统表异常警告:

系统表insert into 报错:

1
2
3
Postrgres=# insert into pg_auditinfo values(10, 'select * from dual;');
WARNING: 01000: generating possibly-non-unique OID for "pg_auditinfo"
WARNING: 01000: generating possibly-non-unique OID for "pg_auditinfo"

解决: include/catalog/indexing.h

1
2
DECLARE_UNIQUE_INDEX(pg_auditinfo_oid_index, 3296, on pg_auditinfo using btree(oid oid_ops));
#define AuditInfoOidIndexId 3296

在其身上创建合适的索引,即可。

欣赏此文? 求鼓励,求支持!