您如何阅读以下代码行? 代码来自 John Saunders 的 SO。 (如果找到,请添加指向它的链接)
SET search_path TO so,"$user", public;
上下文
START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE;
CREATE SCHEMA SO
SET search_path TO so,"$user", public; /// here
...
我将这行读作“将您选择的 PATH 公开设置为给定用户的架构”。 公开似乎意味着 PATH 或用户是公开的。 我不确定为什么我们需要对变量 user 进行配额,因为所有内容都是小写的。
最佳答案
当您的数据库中包含足够多的表并且它们已被拆分为多个模式时,设置 search_path 是非常常见的。了解它的作用和用途的途径是从 schema 开始。文档,其中也涵盖了公共(public)模式在事物中的作用。
$user 在该路径中出现时被替换的方式在 search_path 的文档中有描述。 :
"If one of the list items is the special value $user, then the schema having the name returned by SESSION_USER is substituted, if there is such a schema".
显然您的下一个问题是 SESSION_USER 是什么?它以您连接到数据库的用户名开始,但可以通过 SET SESSION AUTHORIZATION 等命令更改.这个想法是它可以帮助您为每个用户设置一个模式,这可能是锁定每个用户安全性的有用方法。我只听说过它被用于简单的数据库托管类型的环境,在这种环境中,每个用户都有自己的角色和模式,但没有自己的数据库。您可能可以将“$user”部分留在外面并且不会影响任何东西,它只是默认显示并且大多数人不知道如果您不依赖它可以将其删除。
$user 在引号中是因为它是一个 reserved word在 SQL 标准中。如果你必须在 PostgreSQL 中,你可以使用保留字命名事物,即使这是一个坏主意,但你必须始终将它们放在引号中,这样 SQL 解析器就不会误解它们。如果您尝试使用保留字作为列或表的名称,这可能会出现奇怪的错误。除了“用户”之外,您可能不小心尝试将某些列用作列名,因为它们映射到现实世界中常见的事物,包括大小写、默认、结束、完整、左、新、偏移量、顺序和引用。
关于database - 理解 Postgres 中的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1203466/