标签: postgresql

在 Postgres 中的外键 (uuid) 列上创建索引是否有意义?

假设 Postgres 10.X 中有 2 个示例表:

CREATE TABLE public.order (
id       VARCHAR(36) NOT NULL,
...
)

CREATE TABLE public.suborder (
id       VARCHAR(36) NOT NULL,
order_id VARCHAR(36) NOT NULL,
...
CONSTRAINT fk_order FOREIGN KEY (order_id) REFERENCES public.order(id)
)
Run Code Online (Sandbox Code Playgroud)

所有 ID 都是简单的 UUID。经常suborder被查询。即使它引用唯一(UUID)值,order_id创建单独的索引是否有意义?order_id

就像是:

CREATE INDEX suborder_order_idx ON public.suborder(order_id)
Run Code Online (Sandbox Code Playgroud)

postgresql index database-design

6
推荐指数
1
解决办法
6900
查看次数

PostgreSQL 如何默认分区标识列?

PostgreSQL 11
为分区表上的标识列生成默认值的最佳方法是什么。
例如

CREATE TABLE data.log
(
  id              BIGINT GENERATED ALWAYS AS IDENTITY
                  (
                    INCREMENT BY 1
                    MINVALUE -9223372036854775808
                    MAXVALUE 9223372036854775807
                    START WITH -9223372036854775808
                    RESTART WITH -9223372036854775808
                    CYCLE
                  ),
  epoch_millis    BIGINT NOT NULL,
  message         TEXT NOT NULL

) PARTITION BY RANGE (epoch_millis);

CREATE TABLE data.foo_log
PARTITION OF data.log
(
  PRIMARY KEY (id)
)
FOR VALUES FROM (0) TO (9999999999);
Run Code Online (Sandbox Code Playgroud)

如果我做:

INSERT INTO data.foo_log (epoch_millis, message)
VALUES (1000000, 'hello');
Run Code Online (Sandbox Code Playgroud)

我得到:

错误:“id”列中的空值违反了非空约束
详细信息:失败的行包含(null,1000000,hello)。
SQL状态:23502

因为默认生成的值不会应用于分区,除非我将其插入到根表中,如下所示:

INSERT INTO data.log (epoch_millis, message)
VALUES …
Run Code Online (Sandbox Code Playgroud)

postgresql partitioning identity postgresql-11

6
推荐指数
1
解决办法
4722
查看次数

无法撤销 PgSQL AWS RDS 中的权限或删除用户

asd我想从数据库中删除用户。所以,我有两个数据库:foo并且bar用户显然在两个数据库中都有依赖关系。数据库是从 root 用户创建的postgres,但里面的所有foo_migration表和序列都是由用户和分别创建的bar_migration

首先,我以用户身份登录postgres数据库foo。当我尝试删除用户时,我得到:

ERROR: role "asd" cannot be dropped because some objects depend on it包含有关多个序列、表、bar数据库和数据库中一些对象的权限的详细信息postgres

因此,我尝试一一清除事情(同时仍然以数据库postgres中的用户身份登录foo)。我首先尝试REASSIGN OWNED BY asd TO foo_migration;。这会返回ERROR: permission denied,这很奇怪,因为我以用户身份登录postgres。无论如何,然后我尝试

REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM asd;
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM asd;
Run Code Online (Sandbox Code Playgroud)

我得到了一堆WARNING: no …

postgresql role users postgresql-9.6 amazon-rds

6
推荐指数
1
解决办法
1万
查看次数

PostgreSQL如何从匿名代码块返回数据?

我有一个表 mytable (id, "someLongURI", status, "userId") 和一个工作查询:

UPDATE          mytable
SET             status = 'IN_WORK'
WHERE           "someLongURI" IN (
    SELECT      "someLongURI"
    FROM        mytable
    WHERE       status = 'UNUSED'
    AND         pg_try_advisory_xact_lock(id)
    ORDER BY    id ASC 
    LIMIT       1
    FOR UPDATE 
)
RETURNING       id, "someLongURI";
Run Code Online (Sandbox Code Playgroud)

但现在我需要检查“userId”参数,并基于此选择现有行或更新(并接收更新的行)。类似的东西(在 MySQL 中这可以工作):

IF NOT EXISTS (
    SELECT          1
    FROM            mytable tbl
    WHERE           tbl."userId" = 123
)
THEN
    UPDATE          mytable tbl
    SET             tbl.status = 'IN_WORK',
                    tbl."userId" = 123
    WHERE           tbl."someLongURI" IN (
        SELECT      "someLongURI"
        FROM        tbl.mytable
        WHERE       tbl.status = 'UNUSED'
            AND …
Run Code Online (Sandbox Code Playgroud)

postgresql query

6
推荐指数
1
解决办法
7683
查看次数

禁用“删除表(如果存在)”的警告

当我DROP使用该IF EXISTS子句的表(在 PostgreSQL 11.x 中)时,它会发出如下警告:

=> DROP TABLE IF EXISTS tt;

NOTICE:  table "tt" does not exist, skipping
Run Code Online (Sandbox Code Playgroud)

有时,我确实希望某些表不存在,并且不希望在批处理函数/脚本的输出中看到许多类似的警告。

有没有办法完全禁用这种类型的警告?

postgresql

6
推荐指数
1
解决办法
3318
查看次数

错误:“临时文件大小超过 temp_file_limit”

我的数据库突然挂在一些连接许多表的查询上,我看到:

temporary file size exceeds temp_file_limit (1025563kB)
Run Code Online (Sandbox Code Playgroud)

可以在此处查看示例查询和查询计划:

https://pastebin.com/wug86Wrr

http://www.sharecsv.com/s/a6333a7f610e049dd81ebcfc19a4c02f/temp_file_limit_exceeded.csv

此查询通常需要不到 100 毫秒,但在达到临时文件大小限制时会挂起。

当我跑步时:

SELECT temp_files AS "Temporary files", temp_bytes AS "Size of temporary files"
FROM pg_stat_database db;
Run Code Online (Sandbox Code Playgroud)

我懂了:

Temporary files  Size of temporary files
---
22550            10651900248
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?


我能够解决更多问题。假设用户列出他们可以说 2 种语言 - 查询运行正常。然后他们编辑自己的个人资料,表示自己懂得 20 种语言。查询最终超出temp_file_limit并挂起。

postgresql configuration

6
推荐指数
1
解决办法
2万
查看次数

6
推荐指数
0
解决办法
680
查看次数

将 Postgres 超级用户限制为仅限本地连接

我有一个包含多个用户的数据库:foobarsuper。我正在考虑pg_hba.conf锁定访问权限。

我希望允许foobar能够通过密码身份验证从任何 IP 进行连接。或者在本地使用信任身份验证。

我想允许super只能通过信任身份验证在本地登录。切勿来自非本地地址。

我就是从这个开始的。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# Allow everything if you're on the same machine.
local   all             all                                     trust
host    all             all             127.0.0.1/32            trust
Run Code Online (Sandbox Code Playgroud)

但是,然后我陷入困境,因为我不知道如何说“所有用户,除了超级用户”。我正在寻找这样的东西。

host    all             not_super       all                     md5
Run Code Online (Sandbox Code Playgroud)

我认为我可以采取的一种方法是列出foobar明确。但是,我想知道是否还有其他方法。

host    all             foo             all                     md5
host    all             bar             all                     md5
Run Code Online (Sandbox Code Playgroud)

postgresql authentication

6
推荐指数
1
解决办法
1722
查看次数

Postgres 存储函数的自定义错误代码类和编号

我正在 Postgres 11.5 中编写一组存储函数,并且希望RAISE EXCEPTION在不满足各种先决条件时执行此操作。例如null需要一个字符串或者带字符串的空字符串,或者超出范围的整数参数等。

我可以RAISE EXCEPTION提供详细信息、提示和消息...但是错误代码应该使用什么范围?我检查了文档,但没有在这里找到任何指导:

https://www.postgresql.org/docs/11/errcodes-appendix.html

我在 StackOverflow 上搜索,发现几年前有一个类似的问题......但没有明确的答案。

是否有一些块或前缀可以安全或常规地用于从存储的函数/过程返回的自定义错误代码?

postgresql error-handling plpgsql

6
推荐指数
1
解决办法
1748
查看次数

PgAdmin 4 - 当密码为空时如何通过 ssh 隧道作为 posgres 连接到数据库?

我正在尝试通过 PgAdmin 4 连接到我的 DigitalOcean 实例上的 Postgres 数据库。

我以 root 身份创建 SSH 隧道,向 PgAdmin 提供我的身份文件。我想以没有密码的 postgres 用户身份登录数据库。

所以 PgAdmin 不允许我登录并需要 postgres 用户的密码。

如果我想通过 SSH 隧道连接,用户 postgres 是否必须有密码?是否可以?我应该做什么才能连接?

步骤1-一般 [步骤2-连接 步骤3-ssh-隧道

postgresql

6
推荐指数
1
解决办法
7881
查看次数