如何为 PostgreSQL 增加系统表字段

1、BKI介绍:http://www.postgresql.org/docs/9.4/static/bki.html

可以不了解,也不影响我们继续,因为有很多现成例子参考;

2、为pg_database增加一个字段 datdummy,打开 /src/include/catalog/pg_database.h:

CATALOG(pg_database,1262) BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248) BKI_SCHEMA_MACRO
{
	NameData	datname;		/* database name */
	Oid			datdba;			/* owner of database */
	int32		encoding;		/* character encoding */
	NameData	datcollate;		/* LC_COLLATE setting */
	NameData	datctype;		/* LC_CTYPE setting */
	bool		datistemplate;	/* allowed as CREATE DATABASE template? */
	bool		datallowconn;	/* new connections allowed? */
	int32		datconnlimit;	/* max connections allowed (-1=no limit) */
	Oid			datlastsysoid;	/* highest OID to consider a system OID */
	TransactionId datfrozenxid; /* all Xids < this are frozen in this DB */
	TransactionId datminmxid;	/* all multixacts in the DB are >= this */
	Oid			dattablespace;	/* default table space for this DB */

#ifdef CATALOG_VARLEN			/* variable-length fields start here */
	aclitem		datacl[1];		/* access permissions */
#endif
} FormData_pg_database;

/* ----------------
 *		Form_pg_database corresponds to a pointer to a tuple with
 *		the format of pg_database relation.
 * ----------------
 */
typedef FormData_pg_database *Form_pg_database;

/* ----------------
 *		compiler constants for pg_database
 * ----------------
 */
#define Natts_pg_database				13
#define Anum_pg_database_datname		1
#define Anum_pg_database_datdba			2
#define Anum_pg_database_encoding		3
#define Anum_pg_database_datcollate		4
#define Anum_pg_database_datctype		5
#define Anum_pg_database_datistemplate	6
#define Anum_pg_database_datallowconn	7
#define Anum_pg_database_datconnlimit	8
#define Anum_pg_database_datlastsysoid	9
#define Anum_pg_database_datfrozenxid	10
#define Anum_pg_database_datminmxid		11
#define Anum_pg_database_dattablespace	12
#define Anum_pg_database_datacl			13

它们最终会被脚本 genbki.pl 利用生成 postgresql.bki文件,用在 initdb 初始化 data cluster 时,有兴趣可以自己学习一下,PG编译系统也是一个充分展示强大 perl 语言的系统;

3、在 dattablespace 下增加新定义:

int8			datdummy;	/* dummy column */

后边字段序号的定义也是很重要的,必须按顺序修改,也要记得属性数相应修改:

#define Natts_pg_database				14
...
#define Anum_pg_database_dattablespace	12
#define Anum_pg_database_datdummy	13
#define Anum_pg_database_datacl			14

预定义的数据库必须也要修改,_null_ 前边增加 100的字段为 datdummy 数据:

DATA(insert OID = 1 (  template1 PGUID ENCODING "LC_COLLATE" "LC_CTYPE" t t -1 0 0 1 1663 100 _null_));

4、编译运行,会发生什么,编译正常,然后 initdb,竟然也神奇的通过了,难道这就好了吗?

Tip:Linux 下不停在一个目录下改代码,可能会遇到莫名的程序问题,试试 make clean

5、那么创建一个数据库试试看:CREATE DATABASE quanzl; 成功了,是不是感觉似乎还缺点什么?

datdummy的赋值,总不能 UPDATE pg_database SET datdummy = xxx 吧?

预订义的数据库比如template1,我们可以在catalog里边定义 BKI 脚本,比如上边的例子,给它一个初始值。程序里也必须有所改动才能成为可操作属性;

6、参照语法修改,创建一个 CREATE DATABASE xxx DUMMY nnn语法,修改结构体 CreatedbStmt 增加新属性,语法分析阶段将此值读入,创建数据库时将它写入属性;

new_record[Anum_pg_database_datdummy - 1] = 1234;

此部分代码在 src/backend/commands/dbcommands.c 中,自行阅读好了,写程序就这么简单。:)

时间: 2024-08-01 22:17:13

如何为 PostgreSQL 增加系统表字段的相关文章

mssql sql server 系统更新,如何正确的增加表字段

转自: http://www.maomao365.com/?p=5277摘要:下文主要讲述,如何对"已上线的系统"中的表,增加新的字段. 系统部署脚本,增加列的方法:在系统脚本发布中,如何是存储过程 自定义函数 视图的修改和新增,我们通常采用以下步骤来编写此类脚本1 判断对象(存储过程 自定义函数 视图)是否存在,如何存在我们就删除对象(存储过程 自定义函数 视图)2 新建对象<hr />但是增加系统字段(列)时,我们不能采用删除表,然后重新的方式进行脚本处理,那么我们通常

[转]PostgreSQL教程:系统表详解

这篇文章主要介绍了PostgreSQL教程(十五):系统表详解,本文讲解了pg_class.pg_attribute.pg_attrdef.pg_authid.pg_auth_members.pg_constraint.pg_tablespace.pg_namespace.pg_database等表的作用和字段介绍,需要的朋友可以参考下 一.pg_class: 该系统表记录了数据表.索引(仍然需要参阅pg_index).序列.视图.复合类型和一些特殊关系类型的元数据.注意:不是所有字段对所有对象

SqlServer给一个表增加多个字段语法

添加字段语法 alter table table_name add column_name +字段类型+ 约束条件 给一个表增加多个字段: use NatureData go alter table XunHu add MaleCount varchar(50) null, FemaleCount varchar(50) null, SubadultCount varchar(50) null, LarvaeCount varchar(50) null, TraceType varchar(50

系统表 sys.syscolumns、sys.sysobjects 和 sys.indexes 的字段含义

syscolumns每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行.该表位于每个数据库中. 列名 数据类型 描述 name sysname 列名或过程参数的名称. id int 该列所属的表对象 ID,或与该参数关联的存储过程 ID. xtype tinyint systypes 中的物理存储类型. typestat tinyint 仅限内部使用. xusertype smallint 扩展的用户定义数据类型 ID. length smallint systypes 中的最

PostgreSQL修改数据库表的列属性(ALTER语句)

一,修改表 PostgreSQL 提供了一族命令用于修改现有表. 可以实现: 增加字段, 删除字段, 增加约束, 删除约束, 修改默认值, 重命名字段, 重命名表. 这些操作可以用:ALTER TABLE命令执行的. 1,增加字段 要增加一个字段,使用这条命令: ALTER TABLE products ADD COLUMN description text; 新增的字段对于表中已经存在的行而言最初将先填充空值. 你也可以同时在该字段上定义约束,使用通常的语法: ALTER TABLE prod

oracle/ms sql 系统表

sql server系统表详细说明 sysaltfiles 主数据库 保存数据库的文件 syscharsets 主数据库字符集与排序顺序 sysconfigures主数据库 配置选项 syscurconfigs主数据库当前配置选项 sysdatabases主数据库服务器中的数据库 syslanguages主数据库语言 syslogins主数据库 登陆帐号信息 sysoledbusers主数据库 链接服务器登陆信息 sysprocesses主数据库进程 sysremotelogins主数据库 远程

Sql 2000系统表 语句查询表结构

SQL2000系统表的应用 –1:获取当前数据库中的所有用户表 select Name from sysobjects where xtype='u' and status>=0 –2:获取某一个表的所有字段 select name from syscolumns where id=object_id('表名') –3:查看与某一个表相关的视图.存储过程.函数 select a.* from sysobjects a, syscomments b where a.id = b.id and b.

ms sql server 系统表详细说明

sysaltfiles  主数据库 保存数据库的文件 syscharsets  主数据库字符集与排序顺序 sysconfigures 主数据库 配置选项 syscurconfigs 主数据库当前配置选项 sysdatabases 主数据库服务器中的数据库 syslanguages 主数据库语言 syslogins 主数据库 登陆帐号信息 sysoledbusers 主数据库 链接服务器登陆信息 sysprocesses 主数据库进程 sysremotelogins主数据库 远程登录帐号 sysc

oracle常用系统表

Oracle查询用户下的所有表 select * from all_tab_comments – 查询所有用户的表,视图等 select * from user_tab_comments – 查询本用户的表,视图等 select * from all_col_comments –查询所有用户的表的列名和注释. select * from user_col_comments – 查询本用户的表的列名和注释 select * from all_tab_columns –查询所有用户的表的列名等信息(