标签: postgresql

在两个表中的触发器函数中选择

我在 x86_64-unknown-linux-gnu 上的 PostgreSQL 9.4.3 中的表和触发器,由 gcc (Debian 4.9.2-10) 4.9.2,64 位编译:

CREATE TABLE measurements (
        measurement_id SERIAL PRIMARY KEY NOT NULL,
        measurement_size_in_bytes INTEGER NOT NULL
    );    

CREATE TABLE file_headers (
        header_id SERIAL PRIMARY KEY NOT NULL, 
        measurement_id INTEGER NOT NULL, 
        file_header_index_start INTEGER,
        file_header_index_end INTEGER
    );

CREATE TRIGGER measurement_ids AFTER INSERT 
        ON measurements FOR EACH ROW 
        EXECUTE PROCEDURE ins_function('SELECT measurement_id FROM measurements 
        ORDER BY measurement_id desc limit 1;', 1, 666 ); 
Run Code Online (Sandbox Code Playgroud)

在那里我假设 SELECT 的数据类型自 SERIAL 以来是 INTEGER 但它显然是错误的,因为我从这个启动触发器的命令中收到错误消息:

INSERT INTO measurements …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger datatypes plpgsql serialization

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

PG 用户对 Web 应用程序的正确设置是什么

我们有一个网络应用程序,可以检测数据库是否不存在并创建它。用户喜欢它,但我的想法是这样的用户拥有太多的权限。

我最好建议更改应用程序的数据库创建屏幕以提供 2 组凭据 - 一组将用于最初创建数据库而不是永久存储(例如“postgres”角色),另一组将被网络使用app 并存储在配置文件中(例如“webapp”)。此外,'webapp' 将需要能够 1) 添加新的和 2) 修改现有的表、过程和函数(Web 应用程序根据需要自动更新架构)

所以我的一些问题是:

  • 使用 PostgreSQL 9.x 时,上述场景中有哪些最佳实践?
  • 创建的数据库应该归“webapp”角色所有还是归“postgres”所有,我只是授予“webapp”必要的权限。如果是后者,新添加的对象是否归“webapp”所有,我应该避免这种情况吗?
  • 社区用户目前使用的方法有哪些?

postgresql security best-practices users postgresql-9.4

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

如何在 VALUES 和 SELECT 之间选择 INSERT?

这个答案向我提出了如何在这样的函数之间VALUESSELECT中进行选择的问题。在 x86_64-unknown-linux-gnu 上使用PostgreSQL 9.4.3,由 gcc (Debian 4.9.2-10) 4.9.2, 64-bit 编译

CREATE OR REPLACE FUNCTION insaft_function()
   RETURNS TRIGGER AS
$func$
BEGIN     
   INSERT INTO file_headers (measurement_id, file_header_index_start
                                           , file_header_index_end)
   VALUES (NEW.measurement_id, TG_ARGV[0]::int, TG_ARGV[1]::int);

   RETURN NULL;  -- result ignored since this is an AFTER trigger
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

VALUES处理多行,但SELECT你可以做更多的事情。这里唯一的要求是对INSERT表格执行上述操作。您可以假设INSERT在系统的持续质量保证中每个周期完成100k 次这样的操作。

我注意到这些差异与我的数据不同,这里选择了三个中值:

VALUES
real      user      sys
-------------------------------
0m0.353s  0m0.256s  0m0.028s
0m0.327s  0m0.252s  0m0.036s
0m0.358s …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger performance select postgresql-performance

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

如果我只关心查询的字段不为空,我是否想要一个索引

在 SQL 中,如果我想要查询的所有内容(在 where 条件中)是字段不为空时,是否所有关于索引的常见考虑都适用?

我可以应用索引的特殊配置来涵盖这种特定情况吗?

例如:

select id
from Accesses
where token is not null;
Run Code Online (Sandbox Code Playgroud)

token如果我必须搜索特定的令牌值,是否值得尽可能多地添加索引?

我的数据库是 Postgres。

postgresql performance

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

PostgreSQL 和表继承

我不确定这是否适合这个地方,所以请随时告诉我它是否偏离主题或有更好的发帖地方。

我正在做一个基于幻想体育的项目,桌子的数量越来越多。我有诸如nba_players,nfl_players等和nba_players_to_teams,nfl_players_to_teams等表(NBA 和 NFL 分别是篮球和美式橄榄球联盟)。这些都共享相同的表模式和代码库,但在不同的表上有它们的外键。

我的问题是,在这种情况下使用表继承有意义吗?“基”表将是空的,仅用于强制执行模式。对“基”表的更改会传播到从它继承的表吗?在这一点上,模式非常稳定,所以这不是一个大问题。

有没有我没有解决的想法或疑虑?我仍在阅读有关表继承及其优缺点的文章,但您拥有的任何资源都将不胜感激。

postgresql database-design inheritance

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

使用增量数据有效计算子查询上的聚合函数

我有一个 PostgreSQL 数据库(9.3.6 版),其中包含大量orders. 随着订单被处理、scan_events触发和存储,每个订单有多个事件。扫描事件有一个布尔值,指示在该事件之后是否可以将订单标记为已完成,但complete可以发生多次扫描。然而,一般来说,我真正关心的唯一扫描是第一次扫描和第一次completed扫描。

我想知道在创建后x天内收到第一次扫描的给定创建日期的订单百分比的平均值和标准差。

架构

CREATE TABLE orders (
    id character varying(40) NOT NULL,
    date_created timestamp with time zone NOT NULL
);

ALTER TABLE ONLY orders
    ADD CONSTRAINT orders_pkey PRIMARY KEY (id);

CREATE TABLE scan_events (
    id character varying(100) NOT NULL,
    order_id character varying(40) NOT NULL,
    "time" timestamp with time zone NOT NULL
);

CREATE INDEX scan_events_order_id_idx ON scan_events USING btree (order_id);
Run Code Online (Sandbox Code Playgroud)

所需的计算

对于days_elapsed1 到 14 …

postgresql performance postgresql-9.3 query-performance

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

索引不与表继承一起使用

我有一个带有主表和 2 个子表的 PostgreSQL 9.0.12 数据库。我的表:

CREATE TABLE test2 (
    id serial PRIMARY KEY,
    coll character varying(15),
    ts timestamp without time zone
);
CREATE INDEX ON test2(ts);

CREATE TABLE test2_20150812 (
    CHECK ( ts >= timestamp '2015-08-12' AND ts < timestamp '2015-08-13' )
) INHERITS (test2);

CREATE TABLE test2_20150811 (
    CHECK ( ts >= timestamp '2015-08-11' AND ts < timestamp '2015-08-12' )
) INHERITS (test2);

CREATE INDEX ON test2_20150812(ts);
CREATE INDEX ON test2_20150811(ts);
VACUUM FULL ANALYZE;
Run Code Online (Sandbox Code Playgroud)

我的选择查询的解释结果(数据库中没有任何行):

EXPLAIN (ANALYZE, BUFFERS) …
Run Code Online (Sandbox Code Playgroud)

postgresql index execution-plan partitioning inheritance

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

PostgreSQL 不会使用它可能使用的所有 RAM

我的 PostgreSQL 9.4.1 服务器出现性能问题。我已经使用通常的最佳实践(pgtune + google)调整了服务器。这是相关的配置:

# <snip> the default config above

default_statistics_target = 50
maintenance_work_mem = 960MB
constraint_exclusion = on
checkpoint_completion_target = 0.9
effective_cache_size = 11GB
work_mem = 96MB
wal_buffers = 8MB
checkpoint_segments = 16
shared_buffers = 4GB
max_connections = 200

autovacuum = on
log_autovacuum_min_duration = 10000
autovacuum_max_workers = 5
autovacuum_naptime = 1min
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 25
autovacuum_vacuum_scale_factor = 0.2
autovacuum_analyze_scale_factor = 0.1
#autovacuum_freeze_max_age = 200000000
autovacuum_vacuum_cost_delay = 20ms
autovacuum_vacuum_cost_limit = -1

#log_statement='mod'
#log_statement='all'

logging_collector = on …
Run Code Online (Sandbox Code Playgroud)

postgresql performance database-tuning postgresql-9.4 performance-tuning

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

在连接中传递附加数据以供 PGSQL 触发器使用

我想向 PG 添加一些审计触发器,以记录对表的所有更改。我找到了一个示例触发器(wiki.postgresql.com - 9.1+ 审计触发器),它让我开始了。

我想要做的是自动传递一些附加数据,例如 theuser-id或 other 键,以便触发器可以将更改链接回进行更改的应用程序用户。基本流程如下:

  • 获取当前请求的连接
  • 运行自定义 SQL 以设置上下文变量 ( set conn_context = {userid};)
  • 读取/解析触发器内的变量
  • 将值与其他信息一起写入日志表

使用 MS SQL 时,我能够通过执行SET CONTEXT_INFO ...data.... 我希望有一种方法可以为 PG 做到这一点;我还没有找到,但这可能是糟糕的 google-fu。

postgresql trigger

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

与 FOREACH 并行遍历多个数组

是否可以FOREACH在 PL/pgSQL 中循环多个数组?就我而言,3 个具有相同维度的数组。我如何传递元素,如:

for(int i = 0 ; i < array1.length ; i++){
  my_method(array1[i], array2[i], array3[i]);
}
Run Code Online (Sandbox Code Playgroud)

这是我的尝试:

select dugong.session_hugeInsert( 3, '5,2,3,1', '4,3,3,2');
Run Code Online (Sandbox Code Playgroud)
NOTICE:  The transaction is in an uncommitable state.Transaction was rolled back.
NOTICE:  query "SELECT Question_ID, UserResponseID_List, UserResponseList" returned 3 columns 42601
ERROR:  cannot begin/end transactions in PL/pgSQL
HINT:  Use a BEGIN block with an EXCEPTION clause instead.
CONTEXT:  PL/pgSQL function dugong.session_hugeinsert(integer,text,text) line 61 at SQL statement
Run Code Online (Sandbox Code Playgroud)

我的功能:

 CREATE OR REPLACE FUNCTION Dugong.Session_hugeInsert(
    Quiz_ID_ int, …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql array

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