服务器 频道

PostgreSQL-后端接口(BKI)

IT168 服务器学院】后端接口(BKI)文件是一些用特殊语言写的脚本,这些脚本是 PostgreSQL 后端能够理解的,以特殊的 "bootstrap"(引导)模式运行,这种模式允许在不存在系统表的零初始条件下执行数据库函数,而普通的 SQL 命令要求系统表必须存在。因此 BKI 文件可以用于在第一时间创建数据库系统。(可能除此以外也没有其它用处。)

    在创建一个新的数据库集群的时候, initdb就是使用 BKI 文件来完成其工作的一部分。 initdb使用的输入的文件是作为制作 PostgreSQL的一部分,由一个叫 genbki.sh 的程序创建的,这个程序读取源代码树目录的 src/include/catalog/ 目录里面的几个特殊格式的 C 头文件。生成的 BKI文件叫 postgres.bki 并且通常安装在安装树里的 share 子目录。

相关的信息可以在有关 initdb 的文档中找到。

    BKI 文件格式

    本节描述 PostgreSQL 后端是如何理解 BKI 文件。如果把 postgres.bki 文件拿来做为例子, 这些描述会变得容易理解些。 你还可以学习 initdb 的源程序以便获取后端是如何激活的概念。

    BKI输入是由一系列命令组成的。 命令是由一些记号组成的,具体是什么由命令语法决定。记号通常是用空白分隔的,但是如果没有歧义的话可以不要。 没有什么特殊的命令分隔符;语法上无法属于前面命令的记号开始新的一条命令。 (通常你会把一条新的命令放在新的一行上以保持清晰。) 记号可以是某些关键字,特殊字符(圆括弧,逗号等),数字,或者双引号字串。 所有东西都是大小写敏感的。

    以 # 开头的行被忽略。

open tablename
    打开一个名为 tablename 的表,准备进一步操作。

close [tablename]
    关闭名为 tablename。 的表。如果 tablename 还没有打开,则产生一个错误。如果没有给出 tablename,那么当前打开的表被关闭。

create [bootstrap] [shared_relation] [without_oids] tablename (name1 = type1 [, name2 = type2, ...])
    创建一个叫做 tablename 的表,表字段在圆括弧中给出。

    The following column types are supported directly by bootstrap.c 直接支持下列字段类型: bool,bytea,char (1 字节), name,int2,int4, regproc,regclass, regtype,text,oid, tid,xid, cid,int2vector,oidvector, _int4 (数组),_text (数组), _aclitem(数组)。尽管我们可以创建包含其它类型字段的表, 但是我们只有在创建完 pg_type 并且填充了合适的记录之后才行。

    如果声明了 bootstrap,那么改表将只在磁盘上创建; 不会向 pg_class,pg_attribute 等系统表里面输入任何东西。 因此这样的表将无法被普通的 SQL 操作访问,直到那些记录用硬办法(用 insert 命令)填入。 这个选项用于创建 pg_class 等自身。

    如果声明了 shared_relation,那么表就作为共享表创建。 除非声明了 without_oids,否则将会有 OID。

insert [OID = oid_value] (value1 value2 ...)
    用 value1, value2, 等作为字段值以及 oid_value 作为其 OID(对象标识)向打开的表插入一条新记录,如果 oid_value 为零(0)或省略了改子句,那么使用下一个 OID。

    NULL 可以用特殊的关键字 _null_声明。包含空白的值必须用双引号栝起。

declare [unique] index indexname on tablename using amname (opclass1 name1 [, ...])
    在一个叫 tablename 的表上用 amname 访问方法创建一个叫做 indexname 的索引。 索引的字段叫 name1,name2 等,而使用的操作符表分别是 opclass1,opclass2 等。 将会创建索引文件和恰当的系统表记录,但是索引内容不会被此命令初始化。

    制作索引

    填充前面声明的索引。

0
相关文章