用户权限问题

woo*_*ie1 7 postgresql role

嗨,我正在尝试创建一个登录角色(用户),其修改数据库的能力相当小。他们应该能够选择、删除、创建触发器、插入和更新。然后,我希望拥有多个作为用户成员的帐户,因此它们具有相同的权限,但我可以为单个用户记录编辑。

我在数据库设计中使用 pgadmin,我的程序使用 QtSQL 访问它。

尝试选择一些数据作为测试时,Qt 捕获了我收到的错误消息。当我运行与数据库所有者和超级用户相同的代码时,我没有问题。

bool run_query(const QString & q){
    QSqlDatabase db = QSqlDatabase::database("default");
    QSqlQuery query(db);

    query.exec(q);

    if (!query.isActive()){
        QMessageBox::warning(0, QObject::tr("Database Error"),
                             query.lastError().text());
        return false;
    }

    while (query.next()){
        QString title = query.value(0).toString();
        std::cerr << qPrintable(title) << std::endl;
    }
    return true;
}

run_query("Select forename from contacts;");
Run Code Online (Sandbox Code Playgroud)

错误:关系联系人的权限被拒绝 QPSQL:无法创建查询

到目前为止,我已经创建了角色(用户)。

-- Role: user

-- DROP ROLE "user";

CREATE ROLE "user" LOGIN
  ENCRYPTED PASSWORD 'md54d45974e13472b5a0be3533de4666414'
  NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
COMMENT ON ROLE "user" IS 'Low level user';
Run Code Online (Sandbox Code Playgroud)

因为这给了以前的问题。我尝试为数据库添加公共权限,但这也不起作用。

现在我不知道去哪里寻找解决方案。任何帮助深表感谢。谢谢。

Cra*_*ger 9

GRANTALL数据库的 public 权限大多是多余的(因为 public 有连接,默认情况下是临时的,所以你只会添加CREATE你可能不想做的)。您可能期望GRANT ALL数据库上的 a 导致递归GRANT ALL到包含的模式和表。GRANT不是递归的,所以这不会发生;一个GRANT ALL数据库只授予对CONNECTTEMPORARY数据库的权限,对包含模式和表没有影响。

默认值GRANT来自GRANT 上的文档

PostgreSQL 将某些类型的对象的默认权限授予 PUBLIC。默认情况下,不会向 PUBLIC 授予对表、列、模式或表空间的任何权限。对于其他类型,授予 PUBLIC 的默认权限如下: 数据库的 CONNECT 和 CREATE TEMP TABLE;函数的 EXECUTE 权限;和使用权限的语言。当然,对象所有者可以撤销默认权限和明确授予的权限。(为了获得最大的安全性,请在创建对象的同一事务中发出 REVOKE;这样就没有其他用户可以使用该对象的窗口。)此外,可以使用 ALTER DEFAULT PRIVILEGES 命令更改这些初始默认权限设置。

所以你可以看到你不需要GRANT对数据库做任何事情,除非你希望用户能够创建模式等。你需要:

  • GRANT USAGE ON SCHEMA myschema TO theuser;对于除public. CREATE如果您希望用户能够制作表格、视图等,则可以授予。
  • GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE sometable TO theuser;为表。我省略了TRUNATE,REFERENCESTRIGGER权限,因为您可能不想授予它们。
  • GRANT USAGE ON SEQUENCE sometable_somecolumn_seq TO theuser;对于表默认值中使用的任何序列,显式或通过 aSERIALBIGSERIAL列。

...等。请参阅GRANT上面链接的手册,了解权限的完整定义,哪些对象可用于哪些对象等。注意通配符ALL TABLESALL SEQUENCES选项。

如果这对于每个表、视图、模式、序列等来说似乎太麻烦,您可以在 Pg 9.1 及更高版本中使用ALTER DEFAULT PRIVILEGES来更改GRANT新对象的默认值。


kgr*_*ttn 6

看起来你需要这样的东西:

GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE contacts TO "user";
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我希望"user"不是您选择的实际用户名。它不仅没有传达很多关于角色语义的信息,而且您需要在任何地方引用它,这可能会带来麻烦并在出现问题时导致混乱。如果您为角色选择一个不是关键字的名称并指明角色的用途,您可能会对结果更满意。

我不确定将 QtSQL 层引入问题是否有助于任何人理解这个问题。如果您可以在会议中展示该问题,则psql可能会吸引更多答案。