database - 理解 Postgres 中的语句

标签 database postgresql

您如何阅读以下代码行? 代码来自 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/

相关文章:

django - 连接到 Django 后端的 AWS Postgres 实例

database - isActive 的替代方案

mysql - 1052 : Column 'id' in field list is ambiguous

sql - 奇怪的窗口函数行为

SQL - 联系人、公司数据库设计

mysql - MySQL 仍然是免费/开源数据库的不错选择吗?

iphone - 如何从 sqlite3 中检索数据?

mysql - 映射到另一个表(其实际值保存在 MySQL 中)的表的效率

维护数据库结构的java库

python - 使用 Python 的非阻塞 SQL 执行