除了手动搜索触发器/函数/存储过程中使用的所有 dblink() 之外,还有没有办法查询这些信息?
示例:触发器内部有一个 dblink,我可以从 postgres 模式中选择一些可以识别它的内容吗?
我认为这是手动操作,但只是为了确保我没有遗漏任何东西。
注意:我有一些日志记录,我也在寻找 dblink()
我有一个分区表,其中数据仅驻留在子表中。主表有一个插入触发器,可以将插入的数据分配到适当的子表中。
现在,我需要创建一个 PL/pgSQL 过程,该过程从(主)表中选择一些数据并使用一些更改的值重新插入它。
通常我会使用ROW_COUNT诊断变量并完成它。问题是 ROW_COUNT 始终为 0,因为主表中没有插入任何内容(触发器在途中捕获并重定向插入)。
我的下一个想法是做类似的事情
WITH inserted AS (
INSERT INTO master (...) SELECT ... FROM master WHERE ... RETURNING master.field
) SELECT count(*) FROM inserted INTO rowcount;
Run Code Online (Sandbox Code Playgroud)
但是,再次,rowcount 总是最终为 0,因为没有实际插入到主表中。
如果我做
WITH insertable AS (
SELECT ... FROM master WHERE ...
), blah AS (
SELECT count(*) INTO rowcount FROM insertable
) INSERT INTO master SELECT * FROM insertable;
Run Code Online (Sandbox Code Playgroud)
然后 Postgresql 抱怨说:
错误:INTO 与无法返回数据的命令一起使用
SQL 状态:42601
等等...
如果是我最后的代码提取,我如何将行数inserted放入rowcount我的程序中的变量中,然后我可以用它来做东西 …
我有一个包含三个表的数据库items,parameters并且measurements在两个服务器中都想查询该measuerment表。但是在 PostgeSQL (9.4) 和 SQL Server (2012) 中查询要慢得多。
measurements:
column | type | attributes
---------------+----------------------+-----------------------------------------------------------
id | int/serial | (identity) primary key
measuretime | datetime/timestamp | not null
parameter_id | int | not null (foreign key) references parameters(id)
item_id | int | not null (foreign key) references items(id)
value | float | not null
Run Code Online (Sandbox Code Playgroud)
和两个nonclustered index上measuretime和parameter_id
我插入了 2.609.280 行items(半年,每行间隔 5 秒)和 31.311.360 行measurements …
我有两张表,一张继承了另一张:
CREATE TABLE parent (
col1 INTEGER
);
CREATE TABLE child (
col2 INTEGER
) INHERITS( parent );
// Insert some data
INSERT INTO parent( col1 ) VALUES( 1 );
INSERT INTO child( col1, col2 ) VALUES( 2, 2 );
Run Code Online (Sandbox Code Playgroud)
有什么方法可以查询父表,使其获取子表的所有列?
此查询仅返回父列:
SELECT * FROM parent;
| col1 |
| ---- |
| 1 |
| 2 |
Run Code Online (Sandbox Code Playgroud)
我想要的查询将返回父和子中的所有列:
SELECT ... -- some query, with desired result:
| col1 | col2 |
| ---- | ---- |
| 1 | …Run Code Online (Sandbox Code Playgroud) 我在 Win 2012 服务器上安装了 postgreSQL 9.4.1。
我希望在这台服务器和另一台相同规格的服务器之间设置复制。因此,我按照热备份第 25.2.3 节中有关为备用服务器准备主数据库服务器的指南进行操作,这涉及使用pg_basebackup。
主服务器上的 PostgreSQL 实例包含我们的一个应用程序的数据库。该数据库有 3 个模式,每个模式都有自己的专用表空间。在 Windows 上,表空间位置是通过使用 MKLINK 命令创建的(因为我相信 LOCATION 参数必须指向 Windows 上的符号链接)所以 - 例如,:
mklink /j C:\tbs1 D:\app\tablespace\tbs1
mklink /j C:\tbs2 D:\app\tablespace\tbs2
Run Code Online (Sandbox Code Playgroud)
因此,以上述为例,使用以下命令在 postgreSQL 中创建了一个表空间:
CREATE TABLESPACE app_ops OWNER the_user LOCATION 'C:\tbs1';
Run Code Online (Sandbox Code Playgroud)
这一切都很好。但是,当我希望使用 pg_basebackup 工具时,我收到以下错误/警告 - 没有任何内容写入备份位置:
pg_basebackup -h localhost -U postgres -D C:\master_backup
pg_basebackup: directory "C:\tbs1" exists but is not empty
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我会收到这条特定的消息。
我看到的许多答案中的要点都是关于确保 PG_DATA 中不存在表空间。但是,在我的情况下,它们不是 - PG_DATA 在 Windows 服务的可执行路径中设置为-DC:\Program Files\PostgreSQL\9.4\data,如下所示:
"C:\Program Files\PostgreSQL\9.4\bin\pg_ctl.exe" …Run Code Online (Sandbox Code Playgroud) 是否可以使用连接表之一的表类型来表达返回连接表的存储过程的返回类型?
我的存储过程如下所示:
CREATE or REPLACE FUNCTION selectJoin()
RETURNS SETOF ???
AS $$
BEGIN
RETURN QUERY SELECT t1.*, t2.name
FROM t1, t2
WHERE t1.t2_id = t2.id;
END; $$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
表t1有很多(大约 70 个)列,所以我想以某种方式重用t1RETURNS 子句中的类型。类似(t1, varchar(30))或复合类型继承的东西。有可能吗?
PostgreSQL 9.3 版
如何从较大的范围中减去较小的子范围?
123456789
567
Run Code Online (Sandbox Code Playgroud)
结果:
1234 89
Run Code Online (Sandbox Code Playgroud)
查询语句:
select '[1,9]'::int4range - '[5,7]'::int4range;
ERROR: result of range difference would not be contiguous
Run Code Online (Sandbox Code Playgroud)
结果不适合 int4range,因为它不连续。
如何将结果作为一组 int4ranges?
我正在使用 postgis 函数,即 ST_Clip、ST_PixelHeight。
但我收到此错误 -
错误:rt_raster_load_offline_data:访问离线波段被禁用
实际上,我已经使用
raster2pgsql
在 raster2pgsql 中,我使用 -R 选项仅保存栅格的元数据和数据库中栅格的路径位置(而不是像素)。
如何解决这个问题?
昨晚将我们的数据库从 9.3.5 升级到 9.4.1 后,服务器遇到了高 CPU 峰值。升级是通过 pg_dump 完成的。于是把数据库转成SQL,再导入9.4。
在 CPU 峰值期间,日志中有很多这样的消息:
process X still waiting for ExclusiveLock on extension of relation Y of database Z
after 1036.234 ms
Run Code Online (Sandbox Code Playgroud)
和:
process X acquired ExclusiveLock on extension of relation Y of database Z
after 2788.050 ms
Run Code Online (Sandbox Code Playgroud)
看起来可疑的是,有时在完全相同的毫秒内有几个完全相同的关系号的“获取”消息。
为什么 Postgres 会在同一毫秒内将一个表增长两次?它可能是一个具有高填充因子的索引吗?
欢迎任何有关如何解决此问题的建议。
PS 我也在Postgres 邮件列表上问过这个问题,如果不行,请告诉我。
我在双引导机器上安装了 PostgreSQL 9.4(在 Win 7 和 Ubuntu 14.10 上)。这两个系统共享一个驱动器(NTFS 格式),其中包含一个在 Windows 下创建的 PSQL 数据库目录。显然,PSQL 安装是特定于系统的,而且它们也恰好位于不同的分区上。该驱动器在 Linux 下自动挂载,并授予完全读/写/执行权限。
我想知道是否可以在两个系统之间共享结构和数据,而无需在每次加载新操作系统时复制和/或复制所有内容。实际上,我希望所有数据在 Windows 中创建时都可用于 Ubuntu,反之亦然。
这是可能的,如果是这样,假设所有数据最初是在 Windows 下生成的,如何从 Linux 设置它?
编辑:我尝试运行:
sudo pg_dropcluster --stop 9.4 main
Run Code Online (Sandbox Code Playgroud)
其次是
sudo pg_createcluster -d /db_from_windows_path 9.4 main
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但是当再次启动服务器时,我得到:
sudo /etc/init.d/postgresql start
* Starting PostgreSQL 9.4 database server
* Error: could not exec /usr/lib/postgresql/9.4/bin/pg_ctl /usr/lib/postgresql/9.4/bin/pg_ctl start -D /db_from_windows_path -s -o -c config_file="/etc/postgresql/9.4/main/postgresql.conf" :
[fail]
Run Code Online (Sandbox Code Playgroud)
它看起来非常神秘,特别是因为它/var/log/postgresql/postgresql-9.4-main.log是完全空的,/var/log/postgresql/目录的其余部分也是如此
编辑 2:经过一番观察,我注意到 chown 没有被占用,因为 NTFS 系统显然只能在安装时设置。在修复 /etc/fstab 以将所有权授予 postgres 后, …
postgresql ×10
auto-growth ×1
backup ×1
dblink ×1
fill-factor ×1
group-by ×1
inheritance ×1
linux ×1
locking ×1
partitioning ×1
performance ×1
plpgsql ×1
postgis ×1
range-types ×1
select ×1
windows ×1