标签: postgresql

如何让postgres用户无法删除数据库?

你会使用什么sql语句(用户postgres将执行),这样postgres用户就不可能user1删除(drop)数据库?

或者我可以在某些配置文件中添加规则吗?

postgresql permissions configuration

4
推荐指数
1
解决办法
8939
查看次数

PostgreSQL - 如何管理服务器上不同数据库的 WAL 归档?

我想使用 WAL 归档来增量备份我的数据库。但我的服务器上有两个数据库,但我无力承担用于备份这两个数据库的磁盘空间。所以我只想备份其中之一。我在 PostgreSQL 文档或其他任何地方都没有找到有关多个数据库的任何信息。或者我没有找到任何关于指定 WAL 备份的数据库名称的信息。如果有人可以帮助我,我将不胜感激。

postgresql backup postgresql-9.1

4
推荐指数
1
解决办法
3215
查看次数

我应该为非键列创建索引吗?

我在 PostGreSql 数据库中有一个表定义如下:

CREATE TABLE public."MATCH"(
    "ITEM_A_ID" bigint DEFAULT 0,
    "ITEM_B_ID" bigint DEFAULT 0,
    "OWNER_A_ID" bigint DEFAULT 0,
    "OWNER_B_ID" bigint DEFAULT 0,
    "OTHER_DATA" varchar(100) NOT NULL DEFAULT ''
    CONSTRAINT "MATCH_PK" PRIMARY KEY ("ITEM_A_ID","ITEM_B_ID")
);
Run Code Online (Sandbox Code Playgroud)

它将包含很多行。将会对该表执行很多类似以下的查询:

SELECT * FROM "MATCH" WHERE "OWNER_A_ID" = owner_a_id;
SELECT * FROM "MATCH" WHERE "OWNER_B_ID" = owner_b_id;
Run Code Online (Sandbox Code Playgroud)

我正在考虑在OWNER_A_ID和上创建索引OWNER_B_ID,因为这些列不是键。这是一个好主意吗?如果是,我应该如何创建它们?我应该为两列创建一个索引吗?我应该创建两个索引吗?我应该包括其他列吗?

postgresql index

4
推荐指数
2
解决办法
2414
查看次数

有没有更快的方法在 Postgres 中获得 UNION ALL 行为?

我的 Postgres 数据库中有一个表 (t0),其中的数据如下所示:

t1_id  t2_id
1      1      
2      1
2      1
4      null
4      null
5      null
Run Code Online (Sandbox Code Playgroud)

我有一个查询要返回我想要的结果:

t1_id  t2_id
1      1
4      null
5      null
Run Code Online (Sandbox Code Playgroud)

我的查询看起来像这样:

(
  SELECT DISTINCT ON (t2_id) t1_id, t2_id
  FROM t0
  WHERE t2_id IS NOT NULL
)
UNION ALL
(
  SELECT DISTINCT ON (t1_id) t1_id, t2_id
  FROM t0
  WHERE t2_id IS NULL
)
Run Code Online (Sandbox Code Playgroud)

有没有更快的方法来执行这样的操作?这还不错,但是我在几个地方(使用连接)这样做,所有这些重复的查询似乎都会减慢速度。看来必须有更好的办法了。

这是小提琴形式的查询:http://sqlfiddle.com/#!15 /d41d8/3603

postgresql performance union

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

在 PostgreSQL 中的 CREATE TABLE 上检测到死锁

当检测到死锁时,我正在异步创建多个表。两张表(表 A 和 B)都与一张表(表 C)有 FK,并且我在与表 C 的关系上遇到了死锁。

脚本

CREATE TABLE "TableA"
(
  "Id" uuid NOT NULL,
  "TableCId" uuid NOT NULL,
  CONSTRAINT "PK_TableA_Id" PRIMARY KEY ("Id"),
  CONSTRAINT "FK_TableA_TableC" FOREIGN KEY ("TableCId")
      REFERENCES "TableC" ("Id") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);

CREATE TABLE "TableB"
(
  "Id" uuid NOT NULL,
  "TableCId" uuid NOT NULL,
  CONSTRAINT "PK_TableB_Id" PRIMARY KEY ("Id"),
  CONSTRAINT "FK_TableB_TableC" FOREIGN KEY ("TableCId")
      REFERENCES "TableC" ("Id") MATCH SIMPLE
      ON UPDATE NO ACTION …
Run Code Online (Sandbox Code Playgroud)

postgresql deadlock transaction postgresql-9.3

4
推荐指数
1
解决办法
1944
查看次数

如果其他列被索引,Postgres 更新速度会慢吗?

某些更新在大型 Postgres 表上花费的时间太长。鉴于这些条件:

  • 仅更新一列,且未建立索引
  • 由于之前的更新,该列中的每一行都已包含数据
  • 数据的大小没有改变(例如,重写布尔值)
  • 此表或任何其他表中没有其他列依赖于正在更新的列的值
  • 没有对数据库执行其他查询(这是工作站上的个人研究数据库,而不是企业数据库)
  • 其他列上有索引
  • 带 Bitlocker 的旋转驱动器(非 SSD)和带 Windows 8.1 x64 的快速 PC
  • 该表有 1000 万行和 60 列

...您可能会认为,相对于使用 Bitlocker 旋转媒体的预期,更新将花费合理的时间。我们不会创建更多数据,因此不需要在 HDD 上移动现有数据,只需覆盖它即可。其他索引应该不需要更改。等等,相反,经过20个小时不断的硬盘磨练,我厌倦了等待,停止了查询。如果我删除其他列上的所有索引并重新运行查询,则只需要大约 30 分钟。

为什么与此查询无关的列上的索引会使更新时间膨胀?

postgresql performance index update postgresql-performance

4
推荐指数
1
解决办法
3982
查看次数

Postgres 中有任何内容

我正在寻找正确的语法来过滤组(即已被“d”的行组GROUP BY),其中至少一行符合特定条件。

例如,如果我想选择一个组,其中至少一行的 Fold_change 值大于 4,我希望这样可以工作:

HAVING ANY(rnaseq.fold_change) > 4
Run Code Online (Sandbox Code Playgroud)

但我得到了错误

错误:“ANY”处或附近的语法错误


我怀疑这是因为Postgres 要求常量值位于左侧,但如果我以相反的方式执行此操作,则会收到此错误

4 < ANY(rnaseq.fold_change)
Run Code Online (Sandbox Code Playgroud)

错误:op ANY/ALL(数组)需要右侧数组


我可以让它工作的唯一方法是使用 array_agg 像这样:

4 < ANY(array_agg(rnaseq.fold_change))
Run Code Online (Sandbox Code Playgroud)

但与第一个示例相比,该语法相当混乱,并且必须为每个组手动创建一个数组,听起来根本没有效率。

有没有正确的方法可以在 postgres 中进行 HAVING ANY 操作?

postgresql aggregate

4
推荐指数
1
解决办法
3923
查看次数

pg_dump 不支持 -n

我正在使用 pg_dump(9.2 数据库)来提取一个模式并将其加载到另一个数据库(9.4)中。

好吧,这是命令:

pg_dump -f file.sql -F plain --inserts -n 模式数据库

好的。我的命令完成得非常好,但是,它并没有将所有内容转储到名为 schema 的模式(在上面的示例中)。它将所有内容加载到公共环境中。

编辑

为了使问题更清楚:

转储工作正常。经过检查,它正在将 my 转储schema.tablepublic.table。我希望将其恢复到架构,而不是公开的。

有什么解决这个问题的建议吗?

谢谢

postgresql backup pg-dump

4
推荐指数
1
解决办法
1653
查看次数

无法授予表权限

我已获得 postgres 数据库的凭据,并被告知它有权创建新用户并授予他们访问表的权限。这句话只对了一半。

我想创建一个新用户:

create user foo login encrypted password 'bar';
commit;
Run Code Online (Sandbox Code Playgroud)

还行吧。现在我尝试向该用户授予对所选表的某些特定访问权限:

grant select, insert, update on table baz to foo;
Run Code Online (Sandbox Code Playgroud)

回应是[42501] ERROR: permission denied for relation baz

似乎我被授予的该用户无法从我希望授予访问权限的表中进行选择。select * from baz还给出了 42501 错误。

该查询select distinct(grantor) from information_schema.role_table_grants;返回一个用户名(我们称之为“bob”)。我应该与鲍勃讨论获得我需要的权限吗?

postgresql

4
推荐指数
1
解决办法
7401
查看次数

通过重复模式对行进行排序

给定 Postgres 中的表格,例如

CREATE TABLE t1 (
  type text NOT NULL,
  value int NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

where typecould be A, BorC并给出一个任意的重复模式,如

A B B C B B
Run Code Online (Sandbox Code Playgroud)

如何查询表,以便首先根据模式然后根据值对结果进行排序?换句话说,第一行是A最低的value,第二行是B最低的value,第三行是B第二低的value,依此类推。如果我们用完了特定的类型,我们就移动到模式中的下一个字母(即如果我们没有更多的Cs 要返回,模式就会变成ABBBB)。

类型 价值
一种 1
1
2
C 1
3
4
一种 2
5
6
7
8
一种 3
9 …

postgresql order-by

4
推荐指数
1
解决办法
77
查看次数