AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 24386
Accepted
wookie1
wookie1
Asked: 2012-09-17 04:25:30 +0800 CST2012-09-17 04:25:30 +0800 CST 2012-09-17 04:25:30 +0800 CST

用户权限问题

  • 772

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

我正在使用 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;");

错误:关系联系人的权限被拒绝 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';

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

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

postgresql role
  • 2 2 个回答
  • 11121 Views

2 个回答

  • Voted
  1. Best Answer
    Craig Ringer
    2012-09-17T15:21:21+08:002012-09-17T15:21:21+08:00

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

    默认GRANTs 来自GRANT 上的文档:

    PostgreSQL 将某些类型对象的默认权限授予 PUBLIC。默认情况下,PUBLIC 不会对表、列、模式或表空间授予任何权限。对于其他类型,授予 PUBLIC 的默认权限如下: 数据库的 CONNECT 和 CREATE TEMP TABLE;函数的 EXECUTE 特权;和语言的 USAGE 特权。当然,对象所有者可以撤销默认权限和明确授予的权限。(为了获得最大的安全性,请在创建对象的同一事务中发出 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,REFERENCES和TRIGGER权限,因为您可能不想授予它们。
    • GRANT USAGE ON SEQUENCE sometable_somecolumn_seq TO theuser;对于在表默认值中使用的任何序列,无论是显式地还是通过 aSERIAL或BIGSERIAL列。

    GRANT...等等。有关权限功能的完整定义,哪些对象可用等的完整定义,请参阅上面链接的手册。注意通配符ALL TABLES和ALL SEQUENCES选项。

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

    • 手册为GRANT
    • 手册为ALTER DEFAULT PRIVILEGES
    • 9
  2. kgrittn
    2012-09-17T11:34:25+08:002012-09-17T11:34:25+08:00

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

    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE contacts TO "user";
    

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

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

    • 6

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve