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