标签: postgresql

具有单个数据库用户和连接池的行级安全性

我正在使用node-postgres连接到启用了连接池的 PostgreSQL 9.6 数据库。所有连接都使用同一个数据库用户。我不能使用多个数据库用户的一个原因是,据我所知,在这种情况下,行级安全性和视图不能很好地协同工作,因为视图的所有者用于 RLS。

我现在正在考虑在 Postgres 中使用行级安全性,我想确保我这样做是正确的。

我正在使用SET LOCAL设置当前应用程序用户 ID,然后由行级安全性 USING 子句使用。我能想到通过连接池实现这一点的唯一方法是使用 node-postgres 将每个查询包装在一个事务中,并SET LOCAL在每个事务中执行如下命令。

SET LOCAL postgres.my_user = 20;
Run Code Online (Sandbox Code Playgroud)

以下代码是我想如何定义行级安全性的简化示例,真实版本还有一些条件:

CREATE POLICY table_a_read_policy ON table_a FOR SELECT
USING (
    EXISTS (
    SELECT * 
    FROM permissions 
    WHERE 
        user_id = current_setting('postgres.my_user')::int AND 
        permission_type = 'read'
    )
);
Run Code Online (Sandbox Code Playgroud)

我的理解是,在这种情况下,任何 SQL 注入也会使攻击者能够以这种方式设置任何用户 ID 并规避行级安全性。但是我没有看到任何方法可以避免这种情况,因为我连接的数据库用户必须能够查看整个应用程序的所有数据。

有几点我不完全确定:

  • 使用SET LOCAL作为存储当前应用程序用户身份以实现行级安全的方式是否安全?尤其是在连接池的上下文中?
  • 有没有比在 node-postgres 中的事务中包装每个查询并SET LOCAL每次执行命令更好的方法?
  • 有没有办法以一种 SQL 注入不会自动提供规避行级安全性的能力的方式来构造它(限制使用单个数据库用户建立数据库连接)?

postgresql row-level-security

5
推荐指数
1
解决办法
2493
查看次数

避免输出在 psql 中消失

我打开psql并写:

mydb=> \dt
Run Code Online (Sandbox Code Playgroud)

并显示了此表列表:

                   List of relations
 Schema |            Name            | Type  |  Owner  
--------+----------------------------+-------+---------
 public | auth_group                 | table | foouser
 ...
Run Code Online (Sandbox Code Playgroud)

我必须按下Esc才能返回提示,输出消失了,就像它是一个less会话。

我想保留输出,以便我可以使用其中的信息来编写查询,但谷歌搜索找不到这样做的选项。

postgresql psql

5
推荐指数
2
解决办法
669
查看次数

建模数据库结构以存储多维变量的最佳方法?

我正在处理一些具有多维变量的NetCDF数据。

  • 据我所知,这些字段不是强制性的。
  • 每个变量将具有相同的字段/属性。
  • 每个变量代表对大气的时间和空间测量。Level代表压力水平(就像一层洋葱——厚厚的一层)。

例如,variable称为SO2(二氧化硫)可能是4-D : Time, Level (pressure), latitude, longitude

我需要存储大约 14 个变量。

数据检索趋势

现在,我将需要查询这些数据并提出以下问题:

  • 给我在TL处落在XY之间的variable SO2 的所有行。latitude longitude time level
  • 什么是average temperature用于time 牛逼level 大号
  • 等等...

当前的考虑

我可以让我的数据库中的每一行都是一个,observation并且有以下列:type, lat, long, time, level, value.

或者,也许为每种类型创建一个表variable并包含以下列:lat, long, …

postgresql database-design postgis gdal raster

5
推荐指数
1
解决办法
962
查看次数

PostgreSQL IN 运算符在外部文件中有很多值

我有一个包含很多标识符的文件,每行一个。我还有一个带有这些 id 超集的数据库。我只想用感兴趣的 id 查询数据库。有没有办法“导入”外部文件,或者我是否必须将所有 300 个值复制到 IN 表达式中?这是一个大数据库。

postgresql

5
推荐指数
1
解决办法
321
查看次数

从包含相互指向的 FK 的表中删除记录

背景:这里有点意外的 DBA。我有一个类似 reddit 的网站,用户可以在其中提交指向各种互联网内容的链接,然后可以在每个帖子下发表评论。这个应用程序——我们称之为链接——有两个相应的表来存储数据:linkpublicreply(即每个链接的评论关联)。

问题:由于相互依赖的 FK 约束,我似乎无法从这两个表中删除记录(用于维护)。需要指导来解决这种情况。

详细信息:每个Publicreply对象都存储Link与其关联的对象的 FK 。此外,每个Link对象还保存对与其相关联的最新公开回复的引用。这会造成所有Publicreply对象都有LinkFK 的情况,反之亦然。如:

Table "public.links_link"
        Column        |           Type           |                        Modifiers                        
----------------------+--------------------------+---------------------------------------------------------
 id                   | integer                  | not null default nextval('links_link_id_seq'::regclass)
 description          | text                     | not null
 submitter_id         | integer                  | not null
 submitted_on         | timestamp with time zone | not null
 url                  | character varying(250)   | not null
 image_file           | character varying(100)   | 
 reply_count …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.3

5
推荐指数
1
解决办法
5059
查看次数

当前行日期过去 12 个月的总销售额

我需要根据给定月份的每一行计算给定 client_id 的过去 12 个月的销售额总和。

这是按客户按月汇总的销售额的初始表(此处针对特定客户进行过滤511656A75):

CREATE TEMP TABLE foo AS
SELECT idclient, month_transac, sales
FROM ( VALUES
  ( '511656A75', '2010-06-01',  68.57 ),
  ( '511656A75', '2010-07-01',  88.63 ),
  ( '511656A75', '2010-08-01',  94.91 ),
  ( '511656A75', '2010-09-01',  70.66 ),
  ( '511656A75', '2010-10-01',  28.84 ),
  ( '511656A75', '2015-10-01',  85.00 ),
  ( '511656A75', '2015-12-01', 114.42 ),
  ( '511656A75', '2016-01-01', 137.08 ),
  ( '511656A75', '2016-03-01', 172.92 ),
  ( '511656A75', '2016-04-01', 125.00 ),
  ( '511656A75', '2016-05-01', 127.08 ),
  ( '511656A75', '2016-06-01', 104.17 ), …
Run Code Online (Sandbox Code Playgroud)

postgresql performance join optimization postgresql-9.6 query-performance

5
推荐指数
1
解决办法
4556
查看次数

加快查询计算。我在哪里可以添加索引或优化查询或服务器?

我希望加快单个表上的一些计算。

这是表,我相信它有超过 9300 万行,并且每天都在增长:

CREATE TABLE daily_data
(
  id serial NOT NULL,
  company_id integer NOT NULL,
  trade_date date NOT NULL,
  daily_val numeric NOT NULL,
  bbg_pulls_id integer,
  gen_qtr_end_dt_id integer,
  ern_release_date_id integer,
  wh_calc_id integer,
  CONSTRAINT daily_data_pkey PRIMARY KEY (id),
  CONSTRAINT daily_data_bbg_pulls_id_fkey FOREIGN KEY (bbg_pulls_id)
      REFERENCES bbg_pulls (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT daily_data_company_id_fkey FOREIGN KEY (company_id)
      REFERENCES company (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT daily_data_ern_release_date_id_fkey FOREIGN KEY (ern_release_date_id)
      REFERENCES ern_dt …
Run Code Online (Sandbox Code Playgroud)

postgresql performance postgresql-9.3 postgresql-performance

5
推荐指数
1
解决办法
202
查看次数

PostgreSQL 自动真空:“跳过冻结”页面导致大量膨胀

我在论坛上使用的表格有问题,人们可以在那里添加他们的产品。

每次用户加载页面时,用户的“在线时间戳”都会更新(PHP 行阻止其每小时更新超过 1 次),这会触发其各自产品的“在线时间戳”也更新(扳机)。用户可以随时添加和编辑产品。这是表定义:

CREATE TABLE products (
  id SERIAL PRIMARY KEY,
  userid INT NOT NULL REFERENCES users(id),
  categoryid INT NOT NULL REFERENCES categories (id),
  regionid INT NOT NULL REFERENCES regions(id),
  title VARCHAR(255) NOT NULL,
  description TEXT NOT NULL,
  price DECIMAL(7,2) NOT NULL,
  create_timestamp BIGINT NOT NULL,
  modify_timestamp BIGINT NOT NULL,
  online_timestamp BIGINT NOT NULL
);

CREATE INDEX ON products (categoryid);
CREATE INDEX ON products (userid);
CREATE INDEX ON products (regionid);
Run Code Online (Sandbox Code Playgroud)

大约有 100,000 名用户,大约有 400,000 种产品。由于需要更新“在线时间戳”,该表经常更新(大约每秒 2 次)。

问题是:每周,数据库都变得如此臃肿,以至于我不得不中断网站,将数据库转储到 …

postgresql dump

5
推荐指数
1
解决办法
1466
查看次数

不与 OR 一起使用的索引

我有这样的查询:

SELECT t0.id
FROM platform_conversations t0
LEFT OUTER JOIN contacts t1 ON t1.id = t0.contact_id
WHERE t0.user_id = 5340
AND (
     t0.participant ILIKE '%baa%'  -- (1)
     OR t1.first_name ILIKE '%baa%' -- (2)
     )
LIMIT 50;
Run Code Online (Sandbox Code Playgroud)

CREATE INDEX ix_conversations_participant
  ON platform_conversations USING GIN (participant gin_trgm_ops);

CREATE INDEX ix_trgm_contacts_search
  ON contacts USING GIN (first_name gin_trgm_ops);
Run Code Online (Sandbox Code Playgroud)

并且无法弄清楚为什么索引不与OR条件一起使用。如果我只使用 (1),或者只使用 (2),或者使用AND,它们都被使用。

这是计划:

仅适用于 (1)

Limit  (cost=12.43..203.68 rows=50 width=37) (actual time=0.037..0.037 rows=0 loops=1)
  ->  Bitmap Heap Scan on platform_conversations t0  (cost=12.43..222.80 …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.6

5
推荐指数
1
解决办法
304
查看次数

如何运行 pg_dump 以便它不会减慢其他连接的速度?

我每天在 PostgreSQL 9.3.14 数据库上运行一次 pg_dump。50 GB 大小:

pg_dump -Fc dbname > file
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,虽然pg_dump运行需要几个小时,但所有其他数据库连接都非常慢。

有什么方法可以减少pg_dump消耗的资源,或者有没有更合适的方法来创建不会大大降低数据库服务器速度的定期备份?

例如,从不同的服务器运行 pg_dump 是否有助于其工作服务器上的数据库 I/O?

postgresql backup postgresql-9.3 pg-dump

5
推荐指数
1
解决办法
1612
查看次数