按照这个关于限制 PostgreSQL 中每个查询的资源的答案,我被建议为查询执行设置超时值:
SET statement_timeout TO '1min';
Run Code Online (Sandbox Code Playgroud)
这很好,但有时我想放宽对特定脚本的限制。
psql参数?我试过了psql --set statement_timeout=50,不成功。我正在阅读 Oreilly 的PostgreSQL: Up and Running,并且在使用模式组织数据库部分中,它说search_path可以在数据库级别设置:
例如,如果我们希望 contrib 中的所有对象都可以在没有模式限定的情况下访问,我们将更改我们的数据库,如下所示:
ALTER DATABASE mydb SET search_path="$user",public,contrib;
但是,在键入上面的命令后,我仍然无法在public不限定它们的情况下引用其他模式中的表:
ALTER DATABASE auth SET search_path="$user",public,staging;`
\d users
Run Code Online (Sandbox Code Playgroud)
给出:
Did not find any relation named "users".
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用\d staging.users,它会起作用。
SHOW search_path;
Run Code Online (Sandbox Code Playgroud)
给出:
search_path
----------------
"$user",public
Run Code Online (Sandbox Code Playgroud)
是否默认search_path从postgresql.conf覆盖每个数据库的设置值与ALTER DATABASE ... SET search_path?如果是这样,每个数据库的值有什么用?
我正在运行自定义 Linux 发行版的虚拟机上测试从 PostgreSQL 8.2.1 到 9.2 的升级。升级过程如下:
pg服务pg_dumpallpg服务/var/pg;这是一个简单的单服务器设置)initdbreindexdb 所有数据库referential_constraints视图此过程在一台主机上运行良好,备份和恢复顺利。在另一台具有不同数据库点 1 到 7 的机器上工作正常,但服务器不会启动,除非我添加sleep 1after initdb,即使这样,转储的数据也无法恢复,因为“数据库系统正在启动”。处理这个问题的标准方法是什么,除了这些可怕的黑客:
sleep在任一操作之前花一些时间,编辑:“解决方案”毕竟不起作用。如何确保数据库准备好运行还原?
我有一个表,它使用列存储预订数据starts_at,ends_at每当我查询表以查找重叠预订时,我都可以选择使用以下查询之一:
SELECT * FROM reservations
WHERE starts_at < '2014-01-03 00:00:00'
AND ends_at >='2014-01-01 00:00:00';
Run Code Online (Sandbox Code Playgroud)
或者
SELECT * FROM reservations
WHERE tsrange(starts_at, ends_at) && ('2014-01-01 00:00:00', '2014-01-03 00:00:00')
Run Code Online (Sandbox Code Playgroud)
我在starts_at和ends_at列上有常规的 B 树索引,因此第一个查询总是使用它们。但是,除非我在 tsrange 上定义功能性 GiST 索引,否则第二个查询会执行完整扫描。
create index tsrange_idx on reservations using gist(tsrange(starts_at, ends_at));
Run Code Online (Sandbox Code Playgroud)
我的问题是,随着表的增长,哪个索引会更快?查看查询执行计划,答案可能很明显,但我不精通读取EXPLAIN ANALYZE输出。
我有一个简单的存储过程,其返回值取决于inet_client_addr(). inet_client_addr()在测试我的存储过程时,如何为了单元测试的目的而覆盖?
到目前为止,我想出的唯一解决方案是围绕inet_client_addr()以下内容创建一个包装函数:
CREATE FUNCTION my_inet_client_addr() RETURNS INET AS $$
SELECT inet_client_addr();
$$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)
然后在我的函数中使用它:
CREATE local_connection() RETURNS BOOLEAN AS $$
SELECT my_inet_client_addr() = '127.0.0.1';
$$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)
然后在我的单元测试中,我可以重新定义my_inet_client_addr():
BEGIN;
SELECT PLAN(2);
REPLACE FUNCTION my_inet_client_addr() RETURNS INET AS $$
SELECT '127.0.0.1'::INET;
$$ LANGUAGE sql;
is(local_connection(),TRUE,'Connection from 127.0.0.1 is local');
REPLACE FUNCTION my_inet_client_addr() RETURNS INET AS $$
SELECT '192.168.1.1'::INET;
$$ LANGUAGE sql;
is(local_connection(),FALSE,'Connection from 192.168.1.1. is not local');
ROLLBACK;
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有包装功能的情况下完成相同的任务my_inet_client_addr()?
我正在尝试在 Postgres 中设置一个角色,它可以 a) 创建一个新角色 b) 创建一个新数据库 c) 使该新角色成为数据库的所有者 d) 没有其他权限(尽可能!)
我试过这个:
sc_1=# CREATE ROLE tenant_admin CREATEDB CREATEROLE;
CREATE ROLE
sc_1=# CREATE ROLE user1 IN ROLE tenant_admin LOGIN NOINHERIT ENCRYPTED PASSWORD 'xyz';
CREATE ROLE
sc_1=#
Run Code Online (Sandbox Code Playgroud)
其次是(在另一个会话中)
tahaan@Komputer:~/projects/acme-project$ psql -U user1 -h localhost -d postgres
Password for user user1:
psql (9.3.6)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.
postgres=> SET ROLE tenant_admin;
SET
postgres=> CREATE DATABASE "Tenant1" TEMPLATE "tenant_template";
CREATE DATABASE
postgres=> CREATE ROLE "owner1";
CREATE ROLE
postgres=> …Run Code Online (Sandbox Code Playgroud) 我需要将一个非常大(约 320 GB)的 PostGIS 数据库从server1(PostgreSQL 9.1,PostGIS 1.5)移动并升级到server2(PostgreSQL 9.3,PostGIS 2.1)。
升级过程有据可查。问题是我在server1上没有足够的空间将文件转储到那里,校验它,然后将它复制到server2并验证总和。我试过:
nc。sshfs。两次转储文件似乎都已损坏。pg_restore在不同的地方打破了这样的错误:
pg_restore: [compress_io] could not uncompress data: incorrect data check
任何人都可以提出更好的方法来完成此移动和升级吗?
更新:尝试过 NFS(并再次尝试 SSHFS)。很明显,这些远程文件系统无法可靠地传输这么多数据。生成的 SQL 文件中明显缺少块,导致导入过程中出现如下语法错误:
ERROR: invalid input syntax for integer: "8266UPDATE spatial_ref_sys o set auth_name = n.auth_name, auth_srid = n.auth_srid, srtext = n.srtext, proj4text = n.proj4text FROM _pgis_restore_spatial_ref_sys n …Run Code Online (Sandbox Code Playgroud) 像这样的查询
SELECT a.id, a.name,
COALESCE( json_agg(b.*), '[]'::json ),
COALESCE( json_agg(c.*), '[]'::json ),
FROM a
LEFT JOIN b ON a.id = b.a_id
LEFT JOIN c ON a.id = c.a_id
GROUP BY a.id, a.name;
Run Code Online (Sandbox Code Playgroud)
执行时,c和b将彼此相乘并在 JSON 数组对象中产生重复的条目。
我尝试将查询更改为使用 2 个子查询,但出现各种错误和警告,例如“子查询必须只返回一列”等。
我也尝试使用LEFT OUTER JOIN,但我想我还没有掌握连接表的工作原理,因为它仅适用于b并且c仍然相乘并包含重复项。
编辑:DISTINCT在COALESCE函数上使用带有“无法识别 json 类型的相等运算符”的错误。
如何修复此查询并仅聚合唯一行?
我需要指定表b和c实际上都是VIEWs,而且它们都至少有一json_agg列,所以我不能只使用json_agg(DISTINCT b.*). 这太容易了。
这是一个重现问题的小片段:
--DROP TABLE …Run Code Online (Sandbox Code Playgroud) 有没有办法防止登录列出架构中的表和列?
我必须授予对远程登录的访问权限才能在单个视图上进行查询;但是,我还必须确保此类登录不能列出该架构上的每个对象。
DENY VIEW ANY DEFINITION TO public;PostgreSQL 上有类似 MS SQL SERVER 的东西吗?
postgresql authentication security authorization permissions
在相关的业务背景,既成员和组织需要有一个帐户的资金。资金可以转移
注意事项
为了为这种场景构建数据库,我创建了以下三个表:
CREATE TABLE Members (
memberid serial primary key,
name varchar(50) unique,
passwd varchar(32),
account integer
);
CREATE TABLE Organizations (
organizationid serial primary key,
name varchar(150) unique,
administrator integer references Members(memberid),
account integer
);
CREATE TABLE TransferHistory
"from" integer, -- foreign key?
"to" integer, -- foreign …Run Code Online (Sandbox Code Playgroud) postgresql ×10
permissions ×2
security ×2
gist-index ×1
index ×1
index-tuning ×1
join ×1
migration ×1
performance ×1
postgis ×1
restore ×1
schema ×1
subtypes ×1
ubuntu ×1
unit-test ×1
upgrade ×1