Hel*_*Vim 7 postgresql pg-dump pg-restore pg
我使用 pg_dump 和 pg_restore 对数据库进行每日备份,这些备份在我推送更新后最近停止工作。
我有一个函数validate_id,它是一个Case/When语句,可以快速检查一些存在完整性问题的数据。看起来像这样:
CREATE OR REPLACE FUNCTION validate_id(
_string text,
_type type
) RETURNS boolean AS
$$
SELECT
CASE WHEN (stuff) THEN TRUE
WHEN (other stuff) THEN TRUE
When (more stuff) THEN raise_err('Not an accepted type, the accepted types are: x y z')
ELSE FALSE
$$
LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
由于我添加了此功能,当我使用此命令转储时:
pg_dump -U postgres -h ipaddress -p 5432 -w -F t databaseName > backupsfolder/databaseName.tar
当我使用这个命令时:
pg_restore -U postgres -h localhost -p 5432 -d postgres -C "backupsfolder/databaseName.tar"
截至两天前,这会引发错误:
pg_restore: error: could not execute query: ERROR: function raise_err(unknown) does not exist
我完全不知道该做什么。我认为可能发生的情况是它在恢复该功能之前尝试恢复该raise_err功能。我认为这是内置于 postgres 中的(我可以SELECT raise_err('Hello, World');)。这可能吗?这是我的CASE声明,因为我只需要返回布尔值?所有权限似乎都是正确的,并且使用以前的备份进行恢复效果很好。
问题是raise_err您的函数代码中没有模式限定。
这具有潜在的危险:恶意用户可能会创建自己的函数raise_err并进行设置search_path,从而调用错误的函数。
由于pg_restore通常由超级用户运行,因此这可能是一个安全问题。想象一下在索引定义中使用这样的函数!
由于这些原因,在当前版本的 PostgreSQL 中pg_dump设置pg_restore为空。search_path
问题的解决方案是在 SQL 语句中显式使用函数的架构。
| 归档时间: |
|
| 查看次数: |
2218 次 |
| 最近记录: |