首先介绍一下背景。
LedgerSMB 项目是一个在 PostgreSQL 上运行的开源财务会计软件项目。我们在用户定义的函数中实现了大量的业务逻辑,它们充当程序对象方法和数据库行为之间的主要映射工具。目前我们使用数据库用户作为身份验证用户,部分是出于选择(这允许集中的安全逻辑,以便可以编写其他工具并重用授予用户的权限),部分是必要的(在我们从 SQL-Ledger 分叉之后,有用于在该代码库上改进安全性的选项并不多)。
这让我们可以访问 PostgreSQL 可以访问的合理数量的单点登录选项,从 LDAP 到 Kerberos 5。我们甚至可以在涉及密码的地方使用 PAM。它还允许我们在与其他应用程序集成或允许其他客户端界面时重用权限。对于财务会计应用程序来说,这似乎是一场胜利。
有明显的成本。对于 Web 应用程序,我们可以支持的 http 身份验证类型非常有限。例如,DIGEST 完全出局了。BASIC 可以工作,我们可以很容易地实现 KRB5(我计划支持它并在 1.4 中开箱即用)。非常强大的身份验证措施无法直接对此进行适当管理,尽管我们可能会在必要时将它们填充(例如 BASIC + 客户端 SSL 证书,其 cn 与用户名和特定的根 ca 匹配)。
与此同时,我们遇到了相当多的批评,主要来自开发人员,偶尔来自 dba 的批评,他们告诉我应用程序应该是安全屏障,而不是数据库。我的观点仍然是,较小的安全边界通常更好,业务逻辑和安全逻辑的重用是相辅相成的,我觉得重用业务逻辑而不在同一级别重用安全逻辑是危险的的程序。
我在这里错过了任何主要的权衡吗?有没有我没有考虑的问题?
我很难找到关于如何在 PostgreSQL 中缓存索引的“外行”解释,所以我想对这些假设中的任何一个或所有假设进行现实检查:
buffer cache与行位于相同的缓存(?)中,因此索引使用的缓存空间不可用于行。在开始之前,我想明确一点,使用部分索引会产生两个优势:
继续我在上发布的一个问题,将高容量和高访问率的表移动到单独的数据库是个好主意吗?,我正在寻找可用于 PostgreSQL 数据库归档的不同技术/解决方案。
我能想到的几个解决方案是:
任何其他建议/指针/解决方案都非常受欢迎和赞赏。
注意:我们在 CentOS5.2 上运行 PostgreSQL v9.1.3
使用 SQLAlchemy 查询 PgBouncer 后面的 PostgreSQL 数据库,使用事务级池。
用于这种设置的最佳模式是什么?我应该每个进程有一个引擎,使用ConnectionPool,还是应该NullPool为每个请求创建一个引擎,并为每个请求使用?我应该使用完全不同的模式吗?
非常感谢!如果需要更多信息,请告诉我,我会尽快更新。
考虑这个选择语句:
SELECT *,
1 AS query_id
FROM players
WHERE username='foobar';
Run Code Online (Sandbox Code Playgroud)
它返回query_id带有值的列1以及玩家的其他列。
如何将一个至少让上面的SQL回报query_id的1,即使选择,反而找不到行那场比赛?
顺便说一句,它是 PostgreSQL 8.4。
我有一个运行在服务器上的 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 从版本8.4升级到9.4。
该文件是不是很清楚,我。
我的 PostgreSQL 在CentOS 6.6服务器上运行。
我想替换一个表的全部内容,而不影响过程中任何传入的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 中实现这一点?
对于这个问题,您可以假设我没有使用外键。
鉴于当前 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 …
我已将数据导入新数据库(大约 600m 行时间戳、整数、双精度)。然后我创建了一些索引并试图改变一些列(有一些空间不足的问题),数据库被清空了。
现在 pgAdmin III 告诉我“临时文件的大小”是 50G~+。
在Windows 2012 服务器上使用Posgres 9.4.1 。
数据库统计选项卡的屏幕截图:
postgresql ×10
archive ×1
cache ×1
centos ×1
index-tuning ×1
join ×1
null ×1
parameter ×1
partitioning ×1
performance ×1
pgadmin ×1
plpgsql ×1
python ×1
security ×1
select ×1
timestamp ×1
timezone ×1
upgrade ×1