Database 理解Postgres中的语句

Database 理解Postgres中的语句,database,postgresql,Database,Postgresql,如何阅读以下代码行? 代码来自John Saunders的SO。(如果找到,请添加链接) 上下文 START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE; CREATE SCHEMA SO SET search_path TO so,"$user", public; /// here ... 我把这句话理解为“为给定的用户将您选择的路径设置为您的模式”。 Public似乎意味着路径或用户是公共的。 我不知道为什

如何阅读以下代码行? 代码来自John Saunders的SO。(如果找到,请添加链接)

上下文

START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE;   
CREATE SCHEMA SO 
SET search_path TO so,"$user", public;        /// here
...
我把这句话理解为“为给定的用户将您选择的路径设置为您的模式”。 Public似乎意味着路径或用户是公共的。
我不知道为什么我们需要对变量user进行配额,因为所有内容都是小写的。

当sql语句没有明确的模式表示法时,它会设置当前数据库连接的模式搜索顺序


在这种情况下,数据库查询引擎将首先搜索模式“so”,然后搜索与当前数据库连接同名的模式,最后搜索名为public的模式。我假设引号是因为美元符号。

当sql语句没有明确的模式符号时,它设置当前数据库连接的模式搜索顺序


在这种情况下,数据库查询引擎将首先搜索模式“so”,然后搜索与当前数据库连接同名的模式,最后搜索名为public的模式。我假设这些引号是因为美元符号。

关于该选项的PostgreSQL文档包含了对其用途的良好描述


这可能是一个罕见的命令,因为默认值几乎总是您想要的。在我所做的任何PostgreSQL工作中,我都不需要使用它。

关于该选项的PostgreSQL文档包含了对其用途的详细描述


这可能是一个罕见的命令,因为默认值几乎总是您想要的。在我所做的任何PostgreSQL工作中,我都不需要使用它。

当数据库中有足够多的表,这些表已被拆分为多个模式时,设置搜索路径是非常常见的。理解它的作用和用途的途径是从文档开始,文档也涵盖了公共模式在事物中的作用

文档中描述了$user出现在该路径中时的替换方式:

“如果列表项之一是 特殊值$user,然后是架构 具有由返回的名称 如果存在,则替换会话\用户 是这样一种模式”

显然,你的下一个问题是会话用户是什么?它以您连接到数据库的用户名开始,但可以通过以下命令进行更改:。其思想是,它可以帮助您为每个用户设置模式,这是锁定每个用户安全性的有用方法。我只听说过在一种简单的数据库托管环境中使用这种方法,在这种环境中,每个用户都有自己的角色和模式,但没有自己的数据库。您可能可以将“$user”部分保留在那里而不影响任何内容,它只是在默认情况下显示,大多数人不知道如果您不依赖它,您可以删除它


$user在引号中,因为这是SQL标准中的一个参数。如果必须,可以在PostgreSQL中使用保留字命名,尽管这不是一个好主意,但必须始终将它们放在引号中,以便SQL解析器不会误解它们。如果您尝试使用保留字作为列或表的名称,则可能会出现奇怪的错误。除了“user”之外,您可能会意外地尝试使用一些列名称,因为它们映射到常见的现实世界中的事物,包括case、default、end、full、left、new、offset、order和references。

当数据库中有足够多的表被拆分为多个模式时,设置搜索路径是非常常见的。理解它的作用和用途的途径是从文档开始,文档也涵盖了公共模式在事物中的作用

文档中描述了$user出现在该路径中时的替换方式:

“如果列表项之一是 特殊值$user,然后是架构 具有由返回的名称 如果存在,则替换会话\用户 是这样一种模式”

显然,你的下一个问题是会话用户是什么?它以您连接到数据库的用户名开始,但可以通过以下命令进行更改:。其思想是,它可以帮助您为每个用户设置模式,这是锁定每个用户安全性的有用方法。我只听说过在一种简单的数据库托管环境中使用这种方法,在这种环境中,每个用户都有自己的角色和模式,但没有自己的数据库。您可能可以将“$user”部分保留在那里而不影响任何内容,它只是在默认情况下显示,大多数人不知道如果您不依赖它,您可以删除它


$user在引号中,因为这是SQL标准中的一个参数。如果必须,可以在PostgreSQL中使用保留字命名,尽管这不是一个好主意,但必须始终将它们放在引号中,以便SQL解析器不会误解它们。如果您尝试使用保留字作为列或表的名称,则可能会出现奇怪的错误。除了“用户”之外,您可能会意外地尝试使用一些列名称,因为它们映射到现实世界中常见的内容,包括大小写、默认值、结束、完整、左、新、偏移量、顺序和引用。

您可能对Greg的答案感兴趣。他很好地解释了搜索路径及其应用。你可能对格雷格的答案感兴趣。他很好地解释了搜索路径及其应用。
START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE;   
CREATE SCHEMA SO 
SET search_path TO so,"$user", public;        /// here
...