Trashed Postgres template1

时间:2009-01-07 02:09:39

标签: postgresql templates

我在psql中搞砸了,并在实现它们之前重命名了template0和template1。现在,当我尝试重新创建template1时,我从psql内部和form命令行中获得了“权限被拒绝复制数据库'template1'”。

为了节省时间,我还需要了解template1与/ data / base中的操作系统读/写权限或者在template1等上授予权限。

TIA

3 个答案:

答案 0 :(得分:6)

你必须告诉PostGreSQL template1是一个模板。如果您不这样做,如果您不是所有者,则不允许复制它:

UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

我必须阅读/src/backend/commands/dbcommands.c(由Google发现)的源代码才能理解这一点。它说:

/*
 * Permission check: to copy a DB that's not marked datistemplate, you
 * must be superuser or the owner thereof.
 */
if (!src_istemplate)
{
        if (!pg_database_ownercheck(src_dboid, GetUserId()))
                ereport(ERROR,
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                 errmsg("permission denied to copy database \"%s\"",
                                                dbtemplate)));
}

我找到了如何做到on a blog

my similar problem

答案 1 :(得分:2)

您是如何尝试“重新创建template1”的?

最简单的方法是删除“template1”架构并从“template0”架构重新创建它。那就是 - 如果“template0”仍在那里。

更多 - here

答案 2 :(得分:1)

您重命名了两个数据库?也许这会做你需要的:

UPDATE pg_database SET datistemplate = TRUE, datname = 'template0' WHERE datname = 'current_template0_name';

UPDATE pg_database SET datistemplate = TRUE, datname = 'template1' WHERE datname = 'current_template1_name';