标签: postgresql

PostgreSQL 金融应用认证方式的选择

首先介绍一下背景。

LedgerSMB 项目是一个在 PostgreSQL 上运行的开源财务会计软件项目。我们在用户定义的函数中实现了大量的业务逻辑,它们充当程序对象方法和数据库行为之间的主要映射工具。目前我们使用数据库用户作为身份验证用户,部分是出于选择(这允许集中的安全逻辑,以便可以编写其他工具并重用授予用户的权限),部分是必要的(在我们从 SQL-Ledger 分叉之后,有用于在该代码库上改进安全性的选项并不多)。

这让我们可以访问 PostgreSQL 可以访问的合理数量的单点登录选项,从 LDAP 到 Kerberos 5。我们甚至可以在涉及密码的地方使用 PAM。它还允许我们在与其他应用程序集成或允许其他客户端界面时重用权限。对于财务会计应用程序来说,这似乎是一场胜利。

有明显的成本。对于 Web 应用程序,我们可以支持的 http 身份验证类型非常有限。例如,DIGEST 完全出局了。BASIC 可以工作,我们可以很容易地实现 KRB5(我计划支持它并在 1.4 中开箱即用)。非常强大的身份验证措施无法直接对此进行适当管理,尽管我们可能会在必要时将它们填充(例如 BASIC + 客户端 SSL 证书,其 cn 与用户名和特定的根 ca 匹配)。

与此同时,我们遇到了相当多的批评,主要来自开发人员,偶尔来自 dba 的批评,他们告诉我应用程序应该是安全屏障,而不是数据库。我的观点仍然是,较小的安全边界通常更好,业务逻辑和安全逻辑的重用是相辅相成的,我觉得重用业务逻辑而不在同一级别重用安全逻辑是危险的的程序。

我在这里错过了任何主要的权衡吗?有没有我没有考虑的问题?

postgresql security database-design

18
推荐指数
1
解决办法
3378
查看次数

PostgreSQL 索引缓存

我很难找到关于如何在 PostgreSQL 中缓存索引的“外行”解释,所以我想对这些假设中的任何一个或所有假设进行现实检查:

  1. PostgreSQL 索引,如行,存在于磁盘上,但可能会被缓存。
  2. 索引可能完全在缓存中,也可能根本不在缓存中。
  3. 它是否被缓存取决于它的使用频率(由查询规划器定义)。
  4. 出于这个原因,大多数“明智”的索引将一直在缓存中。
  5. 索引buffer cache与行位于相同的缓存(?)中,因此索引使用的缓存空间不可用于行。


我理解这一点的动机来自我问的另一个问题,其中建议可以在大部分数据永远不会被访问的表上使用部分索引

在开始之前,我想明确一点,使用部分索引会产生两个优势:

  1. 我们减少了缓存中索引的大小,为缓存中的行本身释放了更多空间。
  2. 我们减少了 B 树的大小,从而加快了查询响应。

postgresql performance cache index-tuning

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

数据库归档解决方案

继续我在上发布的一个问题,将高容量和高访问率的表移动到单独的数据库是个好主意吗?,我正在寻找可用于 PostgreSQL 数据库归档的不同技术/解决方案。

我能想到的几个解决方案是:

  1. 表分区
  2. 单独的表空间和/或模式
  3. 将存档的记录/表移动到不同的硬盘

任何其他建议/指针/解决方案都非常受欢迎和赞赏。

注意:我们在 CentOS5.2 上运行 PostgreSQL v9.1.3

postgresql partitioning postgresql-9.1 archive

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

如何最好地将 SQLAlchemy 中的连接池用于 PgBouncer 事务级池?

使用 SQLAlchemy 查询 PgBouncer 后面的 PostgreSQL 数据库,使用事务级池。

用于这种设置的最佳模式是什么?我应该每个进程有一个引擎,使用ConnectionPool,还是应该NullPool为每个请求创建一个引擎,并为每个请求使用?我应该使用完全不同的模式吗?

非常感谢!如果需要更多信息,请告诉我,我会尽快更新。

postgresql python

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

即使零行匹配,也让 SELECT 返回一个常量值

考虑这个选择语句:

SELECT *, 
       1 AS query_id 
FROM players 
WHERE username='foobar';
Run Code Online (Sandbox Code Playgroud)

它返回query_id带有值的列1以及玩家的其他列。

如何将一个至少让上面的SQL回报query_id1,即使选择,反而找不到行那场比赛?

顺便说一句,它是 PostgreSQL 8.4。

postgresql null select

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

如何在没有时区的情况下将 unix 时间转换为 PostgreSQL 的 Timstamp?

我有一个运行在服务器上的 PostgreSQL 数据库,它的时区设置为印度的时区(即 UTC +5:30)

我在一个表中有一些数据,它是这样创建的:

CREATE TABLE "CLOUDDATA"
(
  "CD_Tm_Obs" timestamp without time zone,
  "CD_Avg_Cloud" double precision
)
Run Code Online (Sandbox Code Playgroud)

我想查询数据并获取特定时间的值。我的输入将是 Unix 时间戳(即 1970 年 1 月 1 日的秒数)

转换UNIX时间时间戳我发现的唯一方法是这样的: select to_timestamp(TRUNC(CAST(1395036000 AS bigint)))。但这会创建一个带时区的时间戳。我的数据在 中timestamp without time zone,所以我没有得到任何结果。

如何在没有时区的情况下将 unix 时间转换为 PostgreSQL 的 Timstamp?

postgresql timestamp timezone

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

如何将 PostgreSQL 从 8.4 版升级到 9.4 版?

我想将我的 PostgreSQL 从版本8.4升级到9.4

文件是不是很清楚,我。

  1. 如果进行升级,我会丢失旧数据库吗?
  2. 如果升级后丢失旧数据库,如何备份它们?
  3. 如何升级我的 psql?

我的 PostgreSQL 在CentOS 6.6服务器上运行。

postgresql upgrade postgresql-8.4 centos postgresql-9.4

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

如何原子替换PostgreSQL中的表数据

我想替换一个表的全部内容,而不影响过程中任何传入的SELECT语句。

用例是有一个表,用于存储定期提取的邮箱信息,并且需要存储在 PostgreSQL 表中。有许多客户端使用不断查询同一张表的应用程序。

通常,我会做类似(伪代码传入)...

BEGIN TRANSACTION
TRUNCATE TABLE
INSERT INTO
COMMIT
Run Code Online (Sandbox Code Playgroud)

但不幸的是,在此过程中无法读取该表;由于INSERT INTO完成需要时间。桌子被锁上了。

在 MySQL 中,我会使用他们的原子RENAME TABLE命令来避免这些问题......

CREATE TABLE table_new LIKE table; 
INSERT INTO table_new;
RENAME TABLE table TO table_old, table_new TO table; *atomic operation*
DROP TABLE table_old;
Run Code Online (Sandbox Code Playgroud)

我如何在 PostgreSQL 中实现这一点?

对于这个问题,您可以假设我没有使用外键。

postgresql

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

函数参数和带有 USING 子句的 JOIN 结果之间的命名冲突

鉴于当前 Postgres 9.4 中的此设置(来自此相关问题):

CREATE TABLE foo (ts, foo) AS 
VALUES (1, 'A')  -- int, text
     , (7, 'B');

CREATE TABLE bar (ts, bar) AS
VALUES (3, 'C')
     , (5, 'D')
     , (9, 'E');
Run Code Online (Sandbox Code Playgroud)

db<> fiddle here(也来自上一个问题)。

SELECT用 a写了一个FULL JOIN来实现引用问题的目标。简化:

SELECT ts, f.foo, b.bar
FROM   foo f
FULL   JOIN bar b USING (ts);
Run Code Online (Sandbox Code Playgroud)

As per specifications, the correct way to address the column ts is without table qualification. Either of the …

postgresql join naming-convention parameter plpgsql

18
推荐指数
1
解决办法
6345
查看次数

PostgreSQL“临时文件的大小”

我已将数据导入新数据库(大约 600m 行时间戳、整数、双精度)。然后我创建了一些索引并试图改变一些列(有一些空间不足的问题),数据库被清空了。

现在 pgAdmin III 告诉我“临时文件的大小”是 50G~+。

  1. 这些临时文件是什么?这些像 SQL Server 事务日志吗?
  2. 我怎样才能摆脱它们,似乎数据库比它应该大得多(数据库的总大小为 91 GB)

Windows 2012 服务器上使用Posgres 9.4.1

数据库统计选项卡的屏幕截图:

数据库统计选项卡的屏幕截图

postgresql pgadmin

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