标签: postgresql

Postgres 大对象和多用户

问题

动态创建的用户无法查询包含大对象的表,因为它最初不是创建的。


背景

我有一个跨2 个实例部署到 AWS 的 Java Atom Hopper 应用程序,这两个实例都使用托管在 RDS 中的Postgres 9.5.2数据库。

保险库凭证

数据库凭据存储在Vault 中,它为 Postgres 中的数据库生成新的登录名和密码。此用户是使用以下权限创建的。

CREATE ROLE "{{name}}" WITH INHERIT LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}';GRANT ALL PRIVILEGES on DATABASE "DATABASE_NAME" to "{{name}}";GRANT databaserole to "{{name}}";
Run Code Online (Sandbox Code Playgroud)

这意味着每次 Java 应用程序启动时,它都会向Vault发送请求,以获取新的用户名和密码。

eg. username: token-1234-5678
=> \du

       Role name     |                  Attributes                   |   Member of
    -----------------+-----------------------------------------------+----------------
    token-1234-5678  |  Password valid until 2016-09-11 09:57:14+00  | {databaserole} (java instance 1) …
Run Code Online (Sandbox Code Playgroud)

postgresql users

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

Postgresql 上的真空和真空分析之间的真正区别是什么?

有什么区别:

vacuum;
Run Code Online (Sandbox Code Playgroud)

vacuum analyze; 
Run Code Online (Sandbox Code Playgroud)

我阅读了postgresql手册,但这对我来说仍然不是 100% 清楚。

我需要同时运行两者,还是其中一个就足够了?

postgresql

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

从 bytea 列导出图像文件

我正在尝试从 PostgreSQL 数据库users_data_circulation中导出图像文件。该表有一个photo(bytea) 列。

我的命令:

copy (select encode(photo,'hex') from users_data_circulation limit 1)
    TO '/tmp/imagetest.hext';
Run Code Online (Sandbox Code Playgroud)

在操作系统中:

$> xxd -p -r /tmp/imagetest.hex > /tmp/imagetest.jpg
$> file /tmp/imagetest.jpg
/tmp/imagetest.jpg: ASCII TEXT
Run Code Online (Sandbox Code Playgroud)

我无法打开jpg文件。我怎样才能把这个文件转换成jpg?

devinim@devinimpostgresql:~$ hexdump -C /tmp/image.hex | more
00000000  5c 5c 33 37 37 5c 5c 33  33 30 5c 5c 33 37 37 5c  |\\377\\330\\377\|
00000010  5c 33 34 30 5c 5c 30 30  30 10 4a 46 49 46 5c 5c  |\340\\000.JFIF\\|
00000020  30 30 …
Run Code Online (Sandbox Code Playgroud)

postgresql export postgresql-9.3 bytea

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

插入数据违反外键约束

考虑我有两个表EmployeeDepartment下面给出的字段:

员工:

Fname、Minit、Lname、SsnBdate、地址、性别、薪水、Super_ssn、Dno

部门:

Dname, Dnumber, Mgr_ssn, Mgr_start_date

Italics and code block 表示表的主键。

在上述情况下,Super_Ssn引用SSN员工,而DNO引用该部的Dnumber。为它们创建 sql 非常简单,首先添加列,然后在形成两个表时更改它们。但是,在插入如下所示的数据时:

insert into employee values('James','E','Borg','888665555','1937-11-10','asda','M',55000,NULL,1);
ERROR:  insert or update on table "employee" violates foreign key constraint "dno_ref_dnum_dpt"
DETAIL:  Key (dno)=(1) is not present in table "department".
Run Code Online (Sandbox Code Playgroud)

insert into sp0090.department values ('Headquarter',1,'888665555','1981-06-19');
ERROR:  insert or update on table "department" violates foreign key constraint "department_mgr_ssn_fkey"
DETAIL:  Key (mgr_ssn)=(888665555) is not …
Run Code Online (Sandbox Code Playgroud)

postgresql foreign-key database-design insert

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

用单个输入数字逐行减法

我想从前一行减法结果中动态减去,作为输入,我想给出一个数字。

我有桌子 a

CREATE TABLE a (id int, code text, qty numeric);
Run Code Online (Sandbox Code Playgroud)

还有里面的数据

INSERT INTO a (id,code,qty)
(1,'test',5),
(2,'test',3),
(3,'test',10);
Run Code Online (Sandbox Code Playgroud)

1.sample - 当输入是16- 期望的结果是:

id | qty
--------------
1  | 0
2  | 0
3  | 2
Run Code Online (Sandbox Code Playgroud)

计算将是这样的

case when 16 > 5 then 16-5 else 5-16 end /* result 11, but displayed 0 */
case when 11 > 3 then 11-3 else 3-11 end /* result 8, but displayed 0 */
case when 8 > 10 then …
Run Code Online (Sandbox Code Playgroud)

postgresql window-functions

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

为什么 pg_last_xact_replay_timestamp() 有时会返回非常旧的时间戳?

在 PostgreSQL 9.5 中,为了监控流复制延迟,我使用了以下组合:

  • pg_current_xlog_location()
  • pg_last_xlog_replay_location()
  • pg_last_xact_replay_timestamp()

前两个函数用于确定主备之间是否存在任何滞后。如果有一些滞后,那么我确定它:

select now() - pg_last_xact_replay_timestamp();
Run Code Online (Sandbox Code Playgroud)

大多数情况下,它返回合理的数量——几秒到几分钟的滞后。但是,该语句偶尔会返回不太可能的大值。几天的滞后。

我们的系统中没有任何交易运行那么长时间,甚至没有关闭。

谁能建议这里发生了什么?

postgresql replication monitoring

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

从表中获取 JSON 列包含特定值的所有行

我正在努力从我的 PostgreSQL 数据库中的 JSON 列中获取数据。在我们的users表中,我们有一known_ips列,它是一个 JSON 列,保存给定用户已知的 IP 地址的平面数组,如下所示:

# select email, known_ips from users limit 3;
       email       |          known_ips                                     
-------------------+-------------------------------
 user1@example.com | ["192.168.1.1","192.168.1.2"]
 user2@example.com | ["192.168.1.3"]
 user3@example.com | ["192.168.1.2"]
(3 rows)
Run Code Online (Sandbox Code Playgroud)

我想要做的是从其列中的一组 IP 地址(在本例中为 192.168.1.1 或 192.168.1.2)中选择具有 IP 地址的所有用户known_ips。因此,在这种情况下,user1 和 user3 的 IP 地址为 .1 或 .2,因此我希望返回它们,而不是 user2,因为我不是在寻找 .3 地址。

我尝试了以下查询,但都无济于事:

  • database=# select email, ip from users, json_array_elements(known_ips) as ip where ip in("192.168.1.1","192.168.1.2");
    ERROR:  column "192.168.1.1" does not exist
    LINE 1: ... json_array_elements(known_ips) …
    Run Code Online (Sandbox Code Playgroud)

postgresql syntax json

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

大批量 INSERTs/UPDATEs 和 DELETEs 性能问题

我在寻找解决以下问题的最佳选择时遇到了问题(postgres 9.5):

我一次从另一个系统获得大约 100.000 行的更新批次。这种情况通常每 10-15 分钟发生一次,但我可能会同时收到多个批次。批次由“类别”分隔,一个批次只包含来自一个批次的数据。每个“类别”每 10-15 分钟更新一次。新行被插入,旧行被删除,仍然存在的行应该更新为新值。

这带来了表产生大量垃圾数据、VACUUM 进程运行非常缓慢以及一般表性能非常差的问题。

现在我想我可以通过为数据中的每个“类别”创建子表并因此“分片”数据来解决这个问题。

在这种情况下,这是否有意义,还是有更好的选择让我坚持?

postgresql

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

何时需要 FROM 子句中的 COLUMN 别名?

FROM提供column_alias,SQL 规范调用这些<derived column list>子句。这就是 postgres 文档对它们的描述,

FROM包含别名的项目的替代名称。别名用于简洁或消除自联接(多次扫描同一个表)的歧义。当提供别名时,它完全隐藏了表或函数的实际名称;例如 given FROM foo AS f, 的其余部分SELECT必须将此FROM项目称为fnot foo。如果编写了别名,还可以编写列别名列表来为表的一列或多列提供替代名称。

什么时候需要这些?我什么时候不能只使用 COLUMN 别名?

SELECT t.*
FROM table_name AS t (a,b,c);
Run Code Online (Sandbox Code Playgroud)

对比

SELECT t.col1 AS a, t.col2 AS b, t.col3 AS c
FROM table_name AS t;
Run Code Online (Sandbox Code Playgroud)

这个例子取自@ypercube 选择的答案??这似乎不太有用。

上述上下文中的 FROM 别名不会提供真正的好处,除非您是

  • 依赖部分别名(不别名整个表)
  • 这取决于升序列排序
  • 你的表有超过三列(或者你可以在 from 子句中明确地写出来)。

这样做似乎依赖于常规t.*堆叠的危害,并增加了晦涩。那么什么时候FROM别名有用呢?

postgresql alias

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

模式所有者的隐式权限

我对 Postgres 中的模式所有者感到困惑。

当我使用AUTHORIZATION关键字定义的所有者创建模式时,所有者可以在该模式中创建对象(pgAdmin4 中的该模式没有显示显式权限)。

但是,当我将架构所有者更改为另一个角色时,此角色无法在该架构中创建对象(除非我明确授予USAGECREATE)。

我想,该架构所有者具有对架构执行任何操作的隐式特权。更改架构所有者芯片的正确方法是什么?

postgresql permissions

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