假设 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 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) 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 …
我有一个表 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) 当我DROP使用该IF EXISTS子句的表(在 PostgreSQL 11.x 中)时,它会发出如下警告:
=> DROP TABLE IF EXISTS tt;
NOTICE: table "tt" does not exist, skipping
Run Code Online (Sandbox Code Playgroud)
有时,我确实希望某些表不存在,并且不希望在批处理函数/脚本的输出中看到许多类似的警告。
有没有办法完全禁用这种类型的警告?
我的数据库突然挂在一些连接许多表的查询上,我看到:
temporary file size exceeds temp_file_limit (1025563kB)
Run Code Online (Sandbox Code Playgroud)
可以在此处查看示例查询和查询计划:
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并挂起。
我有一个包含多个用户的数据库:foo、bar和super。我正在考虑pg_hba.conf锁定访问权限。
我希望允许foo并bar能够通过密码身份验证从任何 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)
我认为我可以采取的一种方法是列出foo并bar明确。但是,我想知道是否还有其他方法。
host all foo all md5
host all bar all md5
Run Code Online (Sandbox Code Playgroud) 我正在 Postgres 11.5 中编写一组存储函数,并且希望RAISE EXCEPTION在不满足各种先决条件时执行此操作。例如null需要一个字符串或者带字符串的空字符串,或者超出范围的整数参数等。
我可以RAISE EXCEPTION提供详细信息、提示和消息...但是错误代码应该使用什么范围?我检查了文档,但没有在这里找到任何指导:
https://www.postgresql.org/docs/11/errcodes-appendix.html
我在 StackOverflow 上搜索,发现几年前有一个类似的问题......但没有明确的答案。
是否有一些块或前缀可以安全或常规地用于从存储的函数/过程返回的自定义错误代码?
我正在尝试通过 PgAdmin 4 连接到我的 DigitalOcean 实例上的 Postgres 数据库。
我以 root 身份创建 SSH 隧道,向 PgAdmin 提供我的身份文件。我想以没有密码的 postgres 用户身份登录数据库。
所以 PgAdmin 不允许我登录并需要 postgres 用户的密码。
如果我想通过 SSH 隧道连接,用户 postgres 是否必须有密码?是否可以?我应该做什么才能连接?
postgresql ×10
amazon-rds ×1
identity ×1
index ×1
partitioning ×1
plpgsql ×1
query ×1
role ×1
security ×1
users ×1