1为pg_database增加一个字段 datdummy,打开 /src/include/catalog/pg_databaseh:
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
它们最终会被脚本 genbkipl 利用生成 postgresqlbki文件,用在 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/dbcommandsc 中,自行阅读好了,写程序就这么简单。:)
我最近使用springboot的时候也遇到跟你一样的问题
看我的BaseModel
public class BaseModel implements Serializable {
@Id
@GeneratedValue(strategy = GenerationTypeAUTO)
@Column(name = "id")
private Long id;
protected BaseModel(){
thisid = 1L;
}
public Long getId() {
return id;
}
public void setId(Long id) {
thisid = id;
}
public boolean equals(Object other) {
if (other == null || othergetClass() != thisgetClass())
return false;
if(thisgetId() == null || ((BaseModel) other)getId() == null) return false;
return thisgetId()equals(((BaseModel) other)getId());
}
public int hashCode() {
return new HashCodeBuilder()append(getId())toHashCode();
}
}
这里的BaseModel是我的实体类的父类,我错误的原因是序列化没有重写好equals函数,因为动态生成sql语句的时候主键默认为null,无法识别这是不是一个新的对象(我的理解),所以重写的时候多了
if(thisgetId() == null || ((BaseModel) other)getId() == null) return false;
因为主键不为空,为null肯定不相等。我就这样解决了,不知道能不能帮到你了。
DECLARE
cnt integer;
SELECT LENGTH('123456@78')-LENGTH(REPLACE('123456@78','@','')) into cnt;
if cnt>0 then
RAISE NOTICE '有@字符共 % ',cnt || '个';
end if;
需要设置字段长度,太长容易被SQL注入攻击,如果怕客户乱写超过长度,你可以建表时,限制字段长度,用约束检查是否超长,如phone number(11) check phone < 12,如果超长就会报错,客户就写入不成功了
以上就是关于如何为 PostgreSQL 增加系统表字段全部的内容,包括:如何为 PostgreSQL 增加系统表字段、Spring boot的Jpa *** 作postgres数据库,pg的数据库不能使用带下划线的字段名吗、pg数据库中判断字段中含不含特殊字符等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)