由于pg_catalog
架构中的对象隐含在search_path
( docs ) 中,是否建议在该架构中安装扩展?
postgresql best-practices postgresql-9.4 postgresql-extensions
我们有一个网络应用程序,可以检测数据库是否不存在并创建它。用户喜欢它,但我的想法是这样的用户拥有太多的权限。
我最好建议更改应用程序的数据库创建屏幕以提供 2 组凭据 - 一组将用于最初创建数据库而不是永久存储(例如“postgres”角色),另一组将被网络使用app 并存储在配置文件中(例如“webapp”)。此外,'webapp' 将需要能够 1) 添加新的和 2) 修改现有的表、过程和函数(Web 应用程序根据需要自动更新架构)
所以我的一些问题是:
我有一个大表(审计),其中存储架构和表的关系 ID。这可以通过触发器使用 TG_RELID 方便地填充。它也很方便,因为我可以对它建立索引,并且索引会比我单独存储“模式”(文本)和“表”(文本)列并对它们建立索引要小。另外,我可以使用它进行查询WHERE relation_id = 'myschema:mytable'::regclass
,它就可以工作。
我的问题是,这在备份/恢复方面是否“安全”(schema.table 在目标服务器中是否具有与源服务器中相同的 regclass/oid ?
我还应该注意其他问题吗?
我有一个专用架构extensions
(PostgreSQL v 9.6.3),我打算在其中安装我的数据库的所有扩展。我想以某种方式禁止(或至少提醒)用户在没有指定特定架构的情况下安装扩展。
所以这应该失败
CREATE EXTENSION tablefunc;
Run Code Online (Sandbox Code Playgroud)
但这应该会成功:
CREATE EXTENSION tablefunc SCHEMA extensions;
Run Code Online (Sandbox Code Playgroud)
为此,我尝试创建事件触发器:
CREATE EVENT TRIGGER e010_verify_extension_schema_et
ON ddl_command_end
WHEN TAG IN ('CREATE EXTENSION')
EXECUTE PROCEDURE verify_extension_schema();
Run Code Online (Sandbox Code Playgroud)
在verify_extension_schema()
功能上,我正在尝试使用pg_catalog.pg_event_trigger_ddl_commands()
. 但是,该函数不会返回任何我可以用来检查是否已指定架构或与此相关的架构的任何内容...
有没有人有任何想法我怎么能做到这一点?
想象一下具有 1:M 关系的多个父子表。我想“级联” - 根据根父表行选择插入重复行。每个表都有IDENTITY
主键,每个子表都有其父 ID 的 FK(上一级)。
给定根父表 ID,为其及其所有子表插入重复行。
我尝试了“级联”插入 CTE,但遇到了RETURNING
仅限返回插入数据的问题,而我需要额外的信息来连接下一个INSERT
.
我通过添加额外的列 ( ) 来完成此任务copied_from_id
。
有没有办法在没有额外列的情况下完成相同的任务?
我确实看到了@Erwin Brandstetter 的这个答案,但他的例子只有 1 个父母和孩子,我不知道如何将其扩展到多个级别
这是示例 DDL 和 DML 来说明问题
--DROP TABLE IF EXISTS lvl_one,lvl_two,lvl_three CASCADE;
CREATE TABLE IF NOT EXISTS public.lvl_one (
id bigint NOT NULL GENERATED ALWAYS AS IDENTITY,
name text,
CONSTRAINT lvl_one_pk …
Run Code Online (Sandbox Code Playgroud) 我们有一个大型查询,当客户“第一次运行它时,一大早......”
所以,我发现pg_prewarm我想使用加载到 PG 的缓冲区缓存一定数量或最近访问的行(插入、更新或删除)来自上述查询中使用的几个表。
此外,我需要确保“预热”不超过 PG 的缓存(我相信是 shared_buffers 设置,还是我错了?)为了预热单个表的最后 1000 页,我可以这样做:
SELECT pg_prewarm(
'mytable',
-- "pre warm" last 1000 pages
first_block := (
SELECT pg_relation_size('mytable') / current_setting('block_size')::int4 - 1000
)
);
Run Code Online (Sandbox Code Playgroud)
问题 1:这种方法有意义吗?
诀窍是 pg_prewarm 只能加载一定数量的页面,所以我需要计算“某个表的页面中有多少活动行”
-- show some settings
SELECT current_setting('block_size')::int4 AS page_size_bytes; -- 8192
SHOW shared_buffers; -- 512 MB
-- https://www.postgresql.org/docs/current/static/pgstattuple.html
--CREATE EXTENSION pgstattuple;
-- find out live row size and live rows per page
SELECT 'mytable'AS table_name, pg_size_pretty(tuple_len / tuple_count) AS live_row_size, 8192.00 / (tuple_len …
Run Code Online (Sandbox Code Playgroud) postgresql performance size disk-space postgresql-performance
postgresql ×6
backup ×1
cte ×1
ddl ×1
ddl-trigger ×1
disk-space ×1
dml ×1
insert ×1
performance ×1
regclass ×1
restore ×1
security ×1
size ×1
trigger ×1
users ×1