我有一个安装程序,需要 plpgsql 在 PostgreSQL 8.4 数据库中安装存储过程。我需要确保安装了语言,否则应用程序将失败。我不想放弃语言并重新添加它,因为这可能会搞砸其他一些事情。
有没有办法“轻轻”安装语言?
CREATE LANGUAGE IF NOT EXISTS
似乎无效。
postgresql plpgsql functions postgresql-8.4 postgresql-extensions
我在 RDS 上创建了数据库实例并使用了以下功能。它在本地开发机器上使用相同的 PostgreSQL 版本时出错。
create or replace function uuid() returns uuid as 'uuid-ossp', 'uuid_generate_v1' volatile strict language C;
Run Code Online (Sandbox Code Playgroud)
这是错误日志:
Run Code Online (Sandbox Code Playgroud)ERROR: permission denied for language c ********** Error ********** ERROR: permission denied for language c SQL state: 42501
我在 ruby on rails 3.2 中使用此函数为我的模式生成 uuid。
postgresql postgresql-9.2 postgresql-9.3 rails postgresql-extensions
是否可以使用 PostgreSQL 中的 citus 扩展来创建复制到每个工作节点的临时表(如引用表)?
当我像这样运行 SQL 时:
DROP TABLE IF EXISTS mypoint;
CREATE TEMP TABLE mypoint (mpoint geometry primary key);
SELECT create_reference_table('mypoint');
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Run Code Online (Sandbox Code Playgroud)ERROR: unacceptable schema name "pg_temp_6" DETAIL: The prefix "pg_" is reserved for system schemas. CONTEXT: while executing command on mynode01:5432 SQL state: 42939
我问这个问题的原因是因为之后有更多的 SQL 命令,我需要在临时表和分布式表之间进行联接(citus 扩展不允许这样做)。
我想将我的产品 Postgres RDS 数据库的主要版本从 11.16 升级到 12.11。我恢复了快照来进行试运行。当尝试修改AWS上的版本时,出现以下错误:
pg_restore: from TOC entry 5375; 1259 180582003 INDEX my_index my_database
pg_restore: error: could not execute query: ERROR: permission denied for schema publicf2iwen5v79e7a7ugjf2zdrpvhvpmr9bc
Command was:
-- For binary upgrade, must preserve pg_class oids
SELECT pg_catalog.binary_upgrade_set_next_index_pg_class_oid('180582003'::pg_catalog.oid);
CREATE INDEX "my_index" ON "publicf2iwen5v79e7a7ugjf2zdrpvhvpmr9bc"."my_table" USING "gin" ("upper"("my_column") "publicf2iwen5v79e7a7ugjf2zdrpvhvpmr9bc"."gin_trgm_ops");
Run Code Online (Sandbox Code Playgroud)
删除此索引和其他 3 个 trgm 索引后,升级工作正常。
我已经检查了扩展程序的所有者,它与其他扩展程序的所有者相同,并且我没有看到这些索引和其他索引之间有任何区别,除了它们来自pg_trgm
您知道如何解决这个问题吗?显然,我想避免在升级版本之前删除真实产品数据库上的这些索引。
从12升级到13时出现同样的问题
我正在使用此命令 sudo apt-get install postgresql-11-repack
来安装 pg_repack(默认为 1.4.8)。
postgresql-11-repack is already the newest version (1.4.8-1.pgdg20.04+1).
Run Code Online (Sandbox Code Playgroud)
当我在 rds postgres 11 中运行“创建扩展 pg_repack”时,它默认使用版本 1.4.4 创建。
List of installed extensions
Name | Version | Schema | Description
--------------+---------+------------+--------------------------------------------------------------
pg_repack | 1.4.4 | public | Reorganize tables in PostgreSQL databases with minimal locks
Run Code Online (Sandbox Code Playgroud)
因此 pg_repack 由于 ec2 和 db 之间的版本号不匹配而失败。
ERROR: pg_repack failed with error: program 'pg_repack 1.4.8' does not match database library 'pg_repack 1.4.4'
Run Code Online (Sandbox Code Playgroud)
我正在尝试查找 PostgreSQL可信过程语言 (PL)的列表,因为我经常需要在非超级用户环境中使用 PL。
但我找不到确切的答案。例如,这里的Postgres 文档表明 perl 有一个受信任和一个不受信任的 PL,这是一种我不太熟悉的语言。这里,它说TRUSTED
关键字是您在创建 PL 语言时可以指定的内容,在某些情况下可能会被忽略。
但我也有(可能是错误的)印象,即某些 PL 语言仅受信任(例如 JavaScript PL/V8)或仅不受信任(Python)。其他帖子似乎表明可以调整 pg 以使用以下内容制作甚至是python
一种可信赖的语言:
UPDATE pg_language SET lanpltrusted = true WHERE lanname = 'plpythonu';
Run Code Online (Sandbox Code Playgroud)
我的问题比理论更实际。基本上:
是否可以将任何 PL 设置为可信和不可信?
如果不是,可以设置为受信任或受信任的特定语言是什么。
(“受信任”是指普通用户在 PL 语言中创建/执行/修改函数时应该具有有效的相同权限。另外,我使用的是 Postgres 9.x)
我crypt()
在我的一个函数中使用了哈希用户密码。但是我在第二天启动我的电脑时观察到,同样的事情失败了,因为密码功能在重新启动时变得不可用。它显示消息,如功能gen_salt()
/crypt()
未知或未定义。我执行了create extension pgcrypto;
一次,它开始工作。
如何在生产环境中处理这个?即使 db 重新启动,有没有办法使该模块在 db 中永久可用?
或者我是否必须指示服务器管理器运行此命令以防他们需要重新启动数据库服务器?
或者我可以在函数本身中编写此语句,以便每次使用加密函数之前都会创建扩展?
此外,我们正在使用 db 的读取副本,它不允许执行此“创建扩展”语句,因为只有读取权限。那么如何在这样的只读环境中使用这种加密功能呢?
postgresql pgcrypto read-only-database postgresql-extensions
据我所知,temp_buffers
设置用于存储临时表数据的服务。
PGDATA
但是,当我创建了一个临时表时,会立即在主数据库中为其创建文件。因此,我希望能就几个问题得到帮助。
a.会发生什么
?临时表数据是否temp_buffers
足以存储临时表数据?
b. 临时表数据是否temp_buffers
不足以存储临时表数据?
是否存在temp_buffers
设置不足而导致溢出的情况pgsql_tmp
?
只是想知道是否有可用于 PostgreSQL 的扩展的官方列表?