PostgreSQL 系统属性添加
PostgreSQL 在插入数据的时候除了维护用户的属性列外,还有几个隐藏的系统属性列,如 ctid
、xmin
和 xmax
等。如下图所示:
从上图中我们可以看到,系统属性列其编号(即 attnum
)为负数,而用户自定义的属性列其编号则为正数(由 1 开始)。本文将介绍如何在 PostgreSQL 中添加自定义系统属性。
PostgreSQL 在插入数据的时候除了维护用户的属性列外,还有几个隐藏的系统属性列,如 ctid
、xmin
和 xmax
等。如下图所示:
从上图中我们可以看到,系统属性列其编号(即 attnum
)为负数,而用户自定义的属性列其编号则为正数(由 1 开始)。本文将介绍如何在 PostgreSQL 中添加自定义系统属性。
有时,我们在克隆代码或者拉取代码时想要跳过 SSL 验证(至于为什么有这么奇葩的需求就不多说了,自行体会),git 提供了多种方式可供用户选择。
首先,我们看来看看克隆代码时如何跳过 SSL 验证。如下,我们可以使用 GIT_NO_SSL_VERIFY
环境变量来设置是否采用 SSL 验证。
1 | $ GIT_SSL_NO_VERIFY=true git clone https://github.com/xxx/xxx |
如果是仓库已经采用 SSL 验证克隆下来,但是在随后的拉取过程中想要取消 SSL 验证,我们可以通过修改配置来完成,例如:
1 | $ git config http.sslVerify false |
如果您想后续的仓库都跳过 SSL 验证,可以设置全局的 http.sslVerify
,如下所示:
1 | $ git config --global http.sslVerify false |
本文将介绍如何在 PostgreSQL 中创建一个新的系统表。PostgreSQL 将系统表都存放在 src/include/catalog
目录下,如下图所示:
从目录结构来看,我们大概可以猜测到 PostgreSQL 将系统表的定义和数据分别存放在两个不同的文件中,例如,系统表 pg_class
,其表结构定义在 pg_class.h
文件中,而数据则在 pg_class.dat
文件中。此外每个表都在数据库内部都有一个唯一的 OID 来作为标识。PostgreSQL 提供了脚本来检查未使用的 OID 以及是否包含重复的 OID,它们分别为 unused_oids
和 duplicate_oids
。所有的系统表都将由 src/backend/catalog/Catalog.pm
进行处理,该文件负责将系统表文件转换为 Perl 数据结构。
本文主要介绍 PostgreSQL 数据库中的临时表 (Temporary Table)。临时表将在会话结束或者当前事务结束时被删除。PostgreSQL 支持临时表和永久存储表 (Permanent Table) 具有相同的名称,如果出现这种情况,那么只有在临时表被删除之后才能看到永久表或者你可以指定 schema 来明确需要查询的是永久表。此外,在临时表上建立的索引同样也是临时的。
最近用 Python 帮人写一个程序,主体工作完成之后,利用 PyQt 写了一个界面,通过命令行运行一切正常,然后,利用 PyInstaller 打包成一个单独的可执行文件时,问题就来了:( 。我使用打包命令如下:
1 | pyinstaller -F -w xxx.py |
运行可执行文件时,弹出的对话框显示如下信息,此外就没有别的其它信息了。
1 | "failed to execute script xxx" |
今天朋友咨询了下面一个问题:
一个信息系统中包含全省的数据,但是各个市州可以访问自己的数据,而不能访问其他市州的数据。
例如,四川省下辖的成都市、绵阳市等有自己的数据,它们可以使用自己的用户登陆并更新自己的数据,
而不能修改其他市的数据(不可见);而四川省级别的用户则对下辖的所有市的数据均可见。
在我初看这个问题时,PostgreSQL 的行级安全策略 (Row Security Policy) 浮现在我的脑海中。PostgreSQL 的行级安全策略可以基于每个用户限制正常查询可以返回哪些行,或者由数据修改命令插入,更新或删除哪些行。默认情况下,PostgreSQL 中的表是不具备任何策略的。
在编译完成之后对 Greenplum 数据库进行安装测试时遇到如下问题,
1 | psql: FATAL: semctl(592740353, 7, SETVAL, 0) failed: Invalid argument (pg_sema.c:151) |
从而导致数据库启动失败,从错误结果来看应该是与信号量相关。那么具体是怎么回事呢?
文献 [1] 中给出了关于这个错误的详细说明,问题是由 System V IPC 对象导致的。
配置文件 logind.conf
中的 RemoveIPC
参数控制着 System V IPC 对象是否在用户完全退出的情况下被清除(系统用户排除在外)。在 systemd 212
版本之后这个选项默认是开启的,即 RemoveIPC=yes
。仍在被使用的共享内存段不会被清理,因此 systemd
不会去清理正在使用的共享内存段;但是信号量没有进程附加的概念,因此,当用户退出或进程终止时,即便该信号量正在被使用也会被清理(这里的理解不一定正确,建议直接看原文)。
表达式和运算符是组成 C 语言的基本组成部分,本文主要针对表达式和运算符进行讲解,涉及到赋值运算符、算术运算符、比较运算符和逻辑运算符等运算符以及条件表达式、成员访问表达式和函数调用表达式等一系列表达式。
本文主要介绍 C 语言中的类型及存储类限定符,C 语言中提高了两个类型限定符:const
和 volatile
;类型限定符指明了变量的访问方式。存储类限定符则指定了变量在内存中的存储方式,C 语言提供了四种存储类限定符:auto
,register
,extern
和 static
。