标签: postgresql

安全引用类型名称以防止 SQL 注入

我将如何引用类型名称以防止 SQL 注入。例如,拿这个

SELECT FORMAT('SELECT CAST(%L AS %s);', '5.42', 'int');
                                                 ^ Quote this
Run Code Online (Sandbox Code Playgroud)

这很好用,但如果'int'相反,''int); DROP DATABASE foo;SELECT ('你会遇到一些问题,

SELECT FORMAT('SELECT CAST(%L AS %s);', '5.42', 'int); DROP DATABASE foo;SELECT (');
                          format                          
----------------------------------------------------------
 SELECT CAST('5.42' AS int); DROP DATABASE foo;SELECT ();
(1 row)
Run Code Online (Sandbox Code Playgroud)

我将如何使用动态 SQL 安全地转换为运行时提供的类型?如果我使用%I而不是%s我得到一个标识符(用 安全引用",但类型名称不是标识符并且不能使用双引号)。

受到try_castJasen提供的“PostgreSQL 替代 SQL Server功能”的回答的启发

postgresql sql-injection datatypes dynamic-sql

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

有效地从 am:n 表中返回两个聚合数组

我有一个表,用于表上的多对多关系users来表示用户之间的跟随关系:

CREATE TABLE users (
    id text PRIMARY KEY,
    username text NOT NULL
);

CREATE TABLE followers (
    userid text,
    followid text,
    PRIMARY KEY (userid, followid),
    CONSTRAINT followers_userid_fk   FOREIGN KEY (userid)   REFERENCES users (id),
    CONSTRAINT followers_followid_fk FOREIGN KEY (followid) REFERENCES users (id)
);

CREATE INDEX followers_followid_idx ON followers (followid);
Run Code Online (Sandbox Code Playgroud)

当我想使用与用户相关的数据创建 JSON 响应时,我有两种情况:

  • 通过 id 请求单个用户,
  • 通过 id 列表请求用户对象数组

用户数据对象应包含两个用户 ID 数组,一个是他们关注的用户,另一个是关注他们的用户。为了创建这两个字段,我使用了以下SELECT语句。

DECLARE follows RECORD;
SELECT  array (select followid FROM followers where userid = Puserid) AS following, …
Run Code Online (Sandbox Code Playgroud)

postgresql performance view many-to-many postgresql-10

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

在同一列上查找具有多个索引的表

我在搭建 PostgreSQL 数据库时遇到问题,因为 npgsql 不能很好地处理同一列上有两个索引的表。这是我在 github 上的项目的链接

我正在尝试查找这些索引/表,以便可以将它们从脚手架命令中排除。

例子:

CREATE TABLE public.altreproc (
  apcod integer NOT NULL,
  aptip character(3),
  apcam character(3),
  CONSTRAINT altreproc_pkey PRIMARY KEY (apcod)
);

CREATE INDEX ialtreproc1
  ON public.altreproc
  USING btree
  (aptip COLLATE pg_catalog."default");

CREATE INDEX ialtreproc2
  ON public.altreproc
  USING btree
  (apcam COLLATE pg_catalog."default");

CREATE INDEX ialtreproc3
  ON public.altreproc
  USING btree
  (aptip COLLATE pg_catalog."default" DESC);
Run Code Online (Sandbox Code Playgroud)

我的问题是当一个表有 2 个不同的索引与相同的列(一个ASC和一个DESC)时;我试图在我试图搭建的数据库中查询这样的表/索引。

我的目标是找到在同一列上包含多个索引的表。

postgresql index metadata

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

带有逗号分隔字符串的 Postgres 查询列,用于字符串数组

我有一个表,其中包含如下所示的数据:

id  oe
--  ---------------------------------------------------
 1  04715SNAA90,04715SNAA90ZZ,71501SNAA00,71501SNAA00ZZ
 2  64526915083,64526953474
 3  04715SNAA90,04715SNAA90ZZ,71501SNAA00,71501SNAA00ZZ
 4  F4DH8C607AA,F4DHAA
 5  F4DH8C607AA,F4DHAA
 6  04715SNAA90,04715SNAA90ZZ,71501SNAA00,71501SNAA00ZZ
 7  64526915083,64526953474
 8  F4DH8C607AA,F4DHAA
 9  F3DH19860AA,F3DHAA,F4DH19860AA,F4DHAA
10  F3DH19860AA,F3DHAA,F4DH19860AA,F4DHAA
11  04715SNAA90,04715SNAA90ZZ,71501SNAA00,71501SNAA00ZZ
12  64526915083,64526953474
13  F3DH19860AA,F3DHAA,F4DH19860AA,F4DHAA
14  F4DH8C607AA,F4DHAA
15  F3DH19860AA,F3DHAA,F4DH19860AA,F4DHAA
Run Code Online (Sandbox Code Playgroud)

如何编写查询,在其中传递值数组并返回该列包含数组中任何值的行?

这是有效的,因为我从查找表中获得了另一个值,而我宁愿不这样做,因为表中的hol列上没有索引pubnet
[请不要建议添加一个,因为我无法修改数据库]

SELECT * FROM pubnet 
where hol in (select hol from id2hol where id in ('F3DH19860AA', 'F4DHAA'))
Run Code Online (Sandbox Code Playgroud)

这将是结果集:

id  oe
--  ---------------------------------------------------
 4  F4DH8C607AA,F4DHAA
 5  F4DH8C607AA,F4DHAA
 8  F4DH8C607AA,F4DHAA
 9  F3DH19860AA,F3DHAA,F4DH19860AA,F4DHAA
10  F3DH19860AA,F3DHAA,F4DH19860AA,F4DHAA
13  F3DH19860AA,F3DHAA,F4DH19860AA,F4DHAA
14  F4DH8C607AA,F4DHAA
15  F3DH19860AA,F3DHAA,F4DH19860AA,F4DHAA
Run Code Online (Sandbox Code Playgroud)

postgresql array

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

如何在没有密码的情况下登录 Postgres 数据库?

现在我的 Postgres 的 pg_hba.conf 文件有以下几行:

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
#Should allow connection without password
host    all all 0.0.0.0/0   trust
host    all all ::0/0   trust
Run Code Online (Sandbox Code Playgroud)

我知道这是不安全的。我只是在测试,一旦成功,我将只保留特定用户和数据库

我的理解是trust应该允许用户在没有密码的情况下进行连接。

但是当我这样做时psql -U postgres -d postgres -h 127.0.0.1 -w,我收到错误消息:psql: fe_sendauth: no password supplied

我需要做什么才能允许用户在没有密码的情况下进行连接?

postgresql pg-hba.conf

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

如何有条件地将行附加到结果集?

我有一个复杂的SELECT查询表,用于标识event_id和之间的关系attribute。这是一个VALUES表达式的简化:

SELECT event_id, attribute
FROM (
  VALUES
    (1, '2D'),
    (1, 'IMAX'),
    (2, 'IMAX'),
    (3, '3D')
) event_attribute (event_id, attribute)
Run Code Online (Sandbox Code Playgroud)

我想(event_id, '2D')为每个event_id尚未与3Dor2D属性关联的记录都包含一个额外的记录。如何有条件地将行附加到结果集?

在上表的情况下,预期结果将是:

(1, '2D'),
(1, 'IMAX'),
(2, 'IMAX'),
(2, '2D'),
(3, '3D')
Run Code Online (Sandbox Code Playgroud)

还有一个表格event,每个相关id.

postgresql

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

错误:列“字段”必须出现在 GROUP BY 子句中或用于聚合函数中

我遇到了一个让我有点困惑的 SQL 问题。关于这个问题,我有两个不同的问题:

  • 为什么?
  • 我该如何解决?

以下查询:

SELECT subs.date_added,subs.subscribed_to,users.userid, users.username, users.email, users.avatar, users.fbuid, users.level, users.avatar_url, users.sex, users.dob, users.profile_hits, users.total_videos, users.subscribers, users.doj, users.extras, users.first_name, users.last_name, users.ban_status, users.usr_status, users.last_logged, users.country, users.user_filter_level, users.signup_ip, subs.userid as subscriber 
FROM cb_subscriptions as subs 
     LEFT JOIN cb_users AS users 
     ON subs.userid=users.userid 
WHERE subs.subscribed_to ='2960' 
GROUP BY subs.subscribed_to ,subs.userid 
ORDER BY subs.date_added ASC 
LIMIT 8;
Run Code Online (Sandbox Code Playgroud)

...产生以下错误:

ERROR: column "users.userid" must appear in the GROUP BY clause or be used in an aggregate function
Run Code Online (Sandbox Code Playgroud)

该字段是 a CHAR,所以我不确定要使用哪种聚合,或者(对我的理解更重要)为什么需要一个聚合。

正如我所说,我不确定我是否理解为什么会发生这种情况。我假设我group …

mysql postgresql migration

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

PostgreSQL 中 SQL Server 的 db_datareader/db_datawriter 相当于什么?

我正在将应用程序从 SQL Server 移植到 PostgreSQL。其中大部分很简单,因为应用程序只真正执行简单的选择、插入和更新。但是我需要创建一个用户来访问数据库。SQL Sever 代码像这样创建它的用户:

USE [master] CREATE LOGIN [ExampleUserName] WITH PASSWORD = 'ExamplePassword', CHECK_EXPIRATION=OFF, CHECK_POLICY=ON;
USE [ExampleDB];
CREATE USER [ExampleUserName] FOR LOGIN [ExampleUserName];
ALTER ROLE [db_datawriter] ADD MEMBER [ExampleUserName];
ALTER ROLE [db_datareader] ADD MEMBER [ExampleUserName];
Run Code Online (Sandbox Code Playgroud)

什么是 PostgreSQL 中的等价物?

postgresql permissions role

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

有没有办法加快 DISTINCT 查询的速度?

我在数据库中有一个表 t (PostgreSQL 10.4):

\d t;
                Table "public.t"
  Column  |          Type          | Collation | Nullable | Default 
----------+------------------------+-----------+----------+---------
 sn       | character varying(11)  |           |          | 
 site     | character varying(50)  |           |          | 
Indexes:
    "site_2018_idx" btree (site), tablespace "indexspace"
    "sn_2018_idx" btree (sn), tablespace "indexspace"
Run Code Online (Sandbox Code Playgroud)

我需要为特定站点找到不同的 'sn,我这样做:

SELECT DISTINCT sn FROM t WHERE site='a_b301_1' ORDER BY sn ;
Run Code Online (Sandbox Code Playgroud)

它可以工作,但速度很慢,返回 75 个不同的“sn”值大约需要 8 分钟!有没有办法加快速度?解释分析给出了这个输出:

QUERY PLAN                                                                                 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Sort  (cost=42873094.21..42873103.25 rows=3615 width=12) (actual time=190431.413..190431.417 rows=75 loops=1)
   Output: sn
   Sort Key: t.sn
   Sort Method: quicksort …
Run Code Online (Sandbox Code Playgroud)

postgresql performance distinct postgresql-10 query-performance

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

数据库如何格式化磁盘文件

这个 SO 答案概述了 MySQL 如何将其数据库组织成文件,但没有描述文件本身的结构。

我想知道,在物理层面,关系数据库管理系统如何将它们的记录存储在文件中。文件的大致结构是什么,列/值在哪里(如果它只是一个 CSV),以及它是如何遍历的。

postgresql storage disk-structures datafile

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