您好我正在尝试创建一个登录角色(用户),其修改数据库的能力相当低。他们应该能够选择、删除、创建触发器、插入和更新。然后,我想拥有多个作为用户成员的帐户,因此它们具有相同的权限,但我可以为单个用户记录编辑。
我正在使用 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';
因为这给了以前的问题。我尝试为数据库添加公共权限,但这也不起作用。
现在我不知道在哪里寻找解决方案。任何帮助深表感谢。谢谢。
GRANT
对数据库的ALL
公共权限大多是多余的(因为公共有连接,默认情况下是临时的,所以你只会添加CREATE
你可能不想做的事情)。您可能期望GRANT ALL
数据库上的 a 会导致递归GRANT ALL
到包含的模式和表。GRANT
不是递归的,所以这不会发生;数据库上的aGRANT ALL
仅授予数据库权限,对包含的模式和表没有影响CONNECT
。TEMPORARY
默认
GRANT
s 来自GRANT 上的文档:所以你可以看到你不需要
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
看起来你需要这样的东西:
顺便说一句,我希望
"user"
不是您选择的实际用户名。它不仅无法传达角色的语义,而且您需要在任何地方引用它,这可能会很麻烦,并且在出现问题时会导致混乱。如果您为角色选择一个不是关键字的名称并指出该角色的用途,您可能会对结果更满意。我不确定将 QtSQL 层带入问题是否有助于任何人理解该问题。如果您可以在会议中展示问题,
psql
您可能会吸引更多答案。