文档章节

PostgreSQL参数search_path影响及作用

有理想的猪
 有理想的猪
发布于 09/19 07:00
字数 715
阅读 18
收藏 0

search_path稍微熟悉PG就会用到,用法这里就不必讲,本篇主要讲它在程序里怎样处理。

1、GUC参数定义

这是个 config_string 参数

	{
		{"search_path", PGC_USERSET, CLIENT_CONN_STATEMENT,
			gettext_noop("Sets the schema search order for names that are not schema-qualified."),
			NULL,
			GUC_LIST_INPUT | GUC_LIST_QUOTE
		},
		&namespace_search_path,
		"\"$user\", public",
		check_search_path, assign_search_path, NULL
	},

设置了两个hook,赋值和检查。assign_search_pathsrc/backend/catalog/namespace.c)只是简单标记参数失效,下次使用时需要再次计算。

void
assign_search_path(const char *newval, void *extra)
{
	/*
	 * We mark the path as needing recomputation, but don't do anything until
	 * it's needed.  This avoids trying to do database access during GUC
	 * initialization, or outside a transaction.
	 */
	baseSearchPathValid = false;
}

2、重新计算的时机

函数 recomputeNamespacePath(void) 重新计算GUC定义的 namespace_search_path

RangeVarGetCreationNamespaceRelnameGetRelidTypenameGetTypid 这类位置会调用它,发生在:创建没有指定schema的对象、按名字查找对象、确定对象可见性等等行为时。这些都可以在 src/backend/catalog/namespace.c 中看到,不再赘述。

3、重新计算的逻辑

首先将 namespace_search_path 按逗号切分成多个元素。

有两个特殊名字的处理:$userpg_temp,前者如果存在与当前用户同名的schema则加入到搜索路径中,不存则没有任何影响;后者如果当前后端对应的临时schema已创建,加入搜索路径,未创建则标记(activeTempCreationPending)下次使用搜索路径前需要先创建,不多讲这个。

其它按名字查找各自的OID,找不到则跳过,最终形成一个搜索链表。至此,这里作为创建对象使用的第一个schema位置,接下来是搜索路径的补足。

很多系统定义都是在 pg_catalog 中,所以:

	if (!list_member_oid(oidlist, PG_CATALOG_NAMESPACE))
		oidlist = lcons_oid(PG_CATALOG_NAMESPACE, oidlist);

如果定义中没有包含它,加到最前边。

同样,临时schema已经创建且没有包含,再加到最前边,也就是说它是在 pg_catalog 前的。

以默认设置:"$user", public 为例,如果不存在同名schema,结果就是不指定scheme时,对象创建在public下,搜索时则先pg_catalog 后 public。

4、系统模式 pg_catalog

看完上边的逻辑,试试把 pg_catalog 加到第一位置会怎样,它会变成默认创建schema:

flying=# set search_path = pg_catalog,public;
SET
flying=# create table t();
ERROR:  permission denied to create "pg_catalog.t"
DETAIL:  System catalog modifications are currently disallowed.
flying=#

在系统模式下建表是不允许的。

5、临时模式

pg_temp 放在第一位置:

flying=# set search_path = pg_temp,public;
SET
flying=# create table t();
CREATE TABLE
flying=# select relpersistence from pg_class where relname='t';
 relpersistence
----------------
 t
(1 row)

flying=# \d+ t
                                  Table "pg_temp_3.t"
 Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+------+-----------+----------+---------+---------+--------------+-------------

创建的是一个临时表,根据文档这是对的,在pg_temp下建表当作临时表。

© 著作权归作者所有

有理想的猪
粉丝 137
博文 120
码字总数 50661
作品 0
红挢
高级程序员
私信 提问
PostgreSQL CVE-2018-1058(search_path) - 暨数据库的那些陷阱与攻防指南

标签 PostgreSQL , search_path , 陷阱 , overload function 背景 PostgreSQL 元宵节对各个版本发布了小版本补丁,主要是解决一个search_path的功能,被攻击者利用来设置陷阱的问题。 https:...

德哥
2018/04/18
0
0
postgresql的安装和启动方法

官方文档 二进制安装和启动:https://www.postgresql.org/download/linux/redhat/ 源码安装:https://www.postgresql.org/docs/11/install-procedure.html 源码启动:https://www.postgresq......

我是大头鸡
06/27
0
0
EDB PPAS(Oracle 兼容版) Oracle与PostgreSQL 兼容模式的参数配置切换

标签 PostgreSQL , EDB , PPAS , 参数 , Oracle模式 , PostgreSQL模式 背景 EDB PPAS是EDB推出的一款同时兼容Oracle和PostgreSQL协议的数据库,在去O的场景中,使用非常广泛,价格便宜,同时...

德哥
2018/05/06
0
0
PostgreSQL的函数安全定义解说

上周,由DBA+杭州群联合发起人周正中分享的PostgreSQL使用安全指导性文章,让大家在数据库的加固操作上受益匪浅。而本周,他将分享关于PostgreSQL的函数安全定义解说。 专家简介 PostgreSQL...

周正中
2015/10/21
0
0
PostgreSQL在Linux下的源码编译安装

1.下载PostgreSQL源码安装包 官方下载地址;http://www.postgresql.org/download/ 本文使用的: postgresql-9.4.4.tar.gz 2.编译安装: tar -zxvf postgresql-9.4.4.tar.gzcd postgresql-9.4......

YuanyuanL
2015/11/05
541
0

没有更多内容

加载失败,请刷新页面

加载更多

使用TensorFlow的AI程序运行报错AttributeError: module 'tensorflow' has no attribute 'xxx'

使用TensorFlow的AI程序,在运行时报错AttributeError: module 'tensorflow' has no attribute 'xxx',首先检查是否是包路径不对,一般是版本变化所致。...

织梦之魂
今天
3
0
提示浏览器版本低

本文转载于:专业的前端网站➭提示浏览器版本低 网站网页在遇到浏览器低版本(尤其是IE浏览器)时,提示浏览器版本低(如IE8以及以下),建议用户升级浏览器以获得最好体验。以下是代码: 1...

前端老手
今天
6
0
CentOS 7系统增加swap

转载请注明文章出处:CentOS 7系统增加swap swap是位于磁盘上的特殊文件(或分区),属于“虚拟内存”的一部分。通俗点就是内存的备胎,内存充足的情况下,基本上没swap什么事(和设置有关)...

tlanyan
今天
6
0
基于Prometheus和Grafana的监控平台 - 环境搭建

相关概念 微服务中的监控分根据作用领域分为三大类,Logging,Tracing,Metrics。 Logging - 用于记录离散的事件。例如,应用程序的调试信息或错误信息。它是我们诊断问题的依据。比如我们说...

JAVA日知录
今天
6
0
PHP运行时全局构造体

struct _php_core_globals { zend_bool magic_quotes_gpc; // 是否对输入的GET/POST/Cookie数据使用自动字符串转义。 zend_bool magic_quotes_runtime; //是否对运行时从外部资源产生的数据使...

冻结not
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部